首页 > 解决方案 > iPhone Numbers 应用程序上的 OpenXML 电子表格 xlsx 导致错误的行高

问题描述

在 C# .NET5 项目中,我使用 OpenXML SDK 生成电子表格文档:

<PackageReference Include="DocumentFormat.OpenXml" Version="2.11.3" />

我在 SAX 模式下工作。非常基本的东西,SpreadsheetDocumentType.Workbook一个 WorkbookPart,一个 WorksheetPart,一个 Sheet/SheetData,一个 SharedStringTablePart。

然后我添加行和单元格元素。

我强制的唯一属性是“r”。行上的行号和单元格上的列名。

这是代码的快速预览:

        public void StartRow()
        {
            var attributes = new List<OpenXmlAttribute>();
            attributes.Add(new OpenXmlAttribute("r", null, rowNumber.ToString()));
            _xmlWriter.WriteStartElement(new Row(), attributes);
        }

        public void EndRow()
        {
            _xmlWriter.WriteEndElement();

            rowNumber++;
            cellNumber = 1;
        }

        public void WriteCellText(string text, DataSourceType type)
        {
            var attributes = new List<OpenXmlAttribute>();
            attributes.Add(new OpenXmlAttribute("r", "", GetExcelColumnName(cellNumber)));

            if (type == DataSourceType.Numeric)
            {
                attributes.Add(new OpenXmlAttribute("t", null, "n"));
                _xmlWriter.WriteStartElement(new Cell(), attributes);
                _xmlWriter.WriteElement(new CellValue(text));
                _xmlWriter.WriteEndElement();
            }
            else
            {
                var sharedIndex = InsertSharedStringItem(text, _sharedStringPart);

                attributes.Add(new OpenXmlAttribute("t", null, "s")); // shared string
                _xmlWriter.WriteStartElement(new Cell(), attributes);
                _xmlWriter.WriteElement(new CellValue(sharedIndex.ToString()));
                _xmlWriter.WriteEndElement();
            }
        }

        private string GetExcelColumnName(uint columnNumber)
        {
            var dividend = columnNumber;
            var columnName = string.Empty;
            uint modulo;

            while (dividend > 0)
            {
                modulo = (dividend - 1) % 26;
                columnName = Convert.ToChar(65 + modulo).ToString() + columnName;
                dividend = ((dividend - modulo) / 26);
            }

            return columnName;
        }

结果文档在 Windows 上的 Microsoft Excel、Android 上的 Microsoft Excel 和 Android 上的 Google Sheets 上显示得非常好。

但是当使用预装的“Numbers”应用在 iPhone 上打开时会出现问题。所有行都展开以占据屏幕的高度:

苹果手机

在 Android Excel 上,它正确显示:

安卓Excel

知道是什么原因导致该 iPhone 应用程序上的单元格高度无效吗?是否有我应该在某处强制使用的属性?

标签: c#iosexcelopenxml-sdk

解决方案


推荐阅读