代码之家  ›  专栏  ›  技术社区  ›  Joe Higley

在Excel中打开OpenXML文件时需要修复

  •  1
  • Joe Higley  · 技术社区  · 7 年前

    我正在开发一个函数,它可以将数据表转换为 .xlsx 使用OpenXML的文件。我能创造出 .xlsx文件

    修复的记录:来自/xl/worksheets/sheet1.xml部分的单元格信息

    我试着从类似的问题中找到解决办法,但没有任何效果。

    public MemoryStream ConvertToXLSX(DataTable table, string sheetName)
    {
        MemoryStream excelStream = new MemoryStream();
    
        using (var workbook = SpreadsheetDocument.Create(excelStream, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook))
        {
            var workBookPart = workbook.AddWorkbookPart();
            workbook.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook();
            workbook.WorkbookPart.Workbook.Sheets = new DocumentFormat.OpenXml.Spreadsheet.Sheets();
    
            uint sheetID = 1;
    
            var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>();
            var sheetData = new SheetData();
            sheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet(sheetData);
    
            DocumentFormat.OpenXml.Spreadsheet.Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>();
            string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart);
    
            if (sheets.Elements<Sheet>().Count() > 0)
            {
                sheetID = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
            }
    
            Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetID, Name = sheetName };
            sheets.Append(sheet);
    
            Row headerRow = new Row();
    
            List<string> columns = new List<string>();
    
            foreach (DataColumn column in table.Columns)
            {
                columns.Add(column.ColumnName);
                Cell cell = new Cell();
                cell.DataType = CellValues.SharedString;
                cell.CellValue = new CellValue(column.ColumnName);
                headerRow.AppendChild(cell);
            }
    
            sheetData.AppendChild(headerRow);
    
            foreach (DataRow tabRow in table.Rows)
            {
                Row newRow = new Row();
    
                foreach (String col in columns)
                {
                    var val = tabRow[col];
    
                    Cell cell = new Cell();
                    cell.DataType = GetCellValueType(val.GetType());
                    cell.CellValue = new CellValue(val.ToString());
                    newRow.AppendChild(cell);
                }
    
                sheetData.AppendChild(newRow);
            }
    
            workbook.WorkbookPart.Workbook.Save();
        }
    
        return excelStream;
    }
    

    以下是数据在Excel中打开后的示例:

    enter image description here

    enter image description here

    1 回复  |  直到 7 年前
        1
  •  3
  •   petelids    7 年前

    你输出的是错误的 cell.DataType . 在头文件中输出 CellValues.SharedString CellValues.String .

    当你打电话的时候,很难说你在为其他的细胞输出什么 GetCellValueType(val.GetType()) CellValues.SharedString 如果你在写一个字符串。

    这个 CellValues.SharedString 只有将值本身写入 SharedStringTable .