修复的logging:从工作表创build的单元格信息

打开我的OpenXML创build的电子表格时,出现错误。 错误如下。

修复logging:xl / worksheets / sheet.xml部分单元格信息

private void SavexlsExcelFile(String fullPathName) { using (SpreadsheetDocument document = SpreadsheetDocument.Create(fullPathName, SpreadsheetDocumentType.Workbook)) { WorkbookPart workbookPart = document.AddWorkbookPart(); workbookPart.Workbook = new Workbook(); worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); worksheetPart.Worksheet = new Worksheet(); Columns columns = new Columns(); worksheetPart.Worksheet.AppendChild(columns); Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets()); Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet" }; sheets.Append(sheet); workbookPart.Workbook.Save(); sheetData = worksheetPart.Worksheet.AppendChild(new SheetData()); List<List<string>> dataRow = new List<List<string>>(); List<String> dtRow = new List<String>(); Row row = new Row(); for (int i = 0; i < dataGridView1.RowCount; i++) { for (int j = 0; j < dataGridView1.ColumnCount; j++) { if (i == 0) { Cell dataCell = new Cell(); dataCell.DataType = CellValues.String; CellValue cellValue = new CellValue(); cellValue.Text = dataGridView1.Columns[j].Name; dataCell.StyleIndex = 2; dataCell.Append(cellValue); row.AppendChild(dataCell); //dataColumn.Add(dataGridView1.Columns[j].Name); } dtRow.Add(dataGridView1.Rows[i].Cells[j].Value.ToString()); } } dataRow.Add(dtRow); sheetData.AppendChild(row); row = new Row(); foreach (List<string> datarow in dataRow) { row = new Row(); foreach(string dtrow in datarow) { row.Append(ConstructCell(dtrow, CellValues.String, 2)); } sheetData.AppendChild(row); } worksheetPart.Worksheet.Save(); } } private Cell ConstructCell(string value, CellValues dataType, uint styleIndex = 0) { return new Cell() { CellValue = new CellValue(value), DataType = new EnumValue<CellValues>(dataType), StyleIndex = styleIndex }; } 

这里有两个问题,我可以看到。 首先是你使用Columns是不正确的。 如果您希望控制诸如列的宽度之类的东西,则应该使用“ Columns 。 要正确使用Columns ,您需要添加子Column元素。 例如(从这里拿):

 Columns columns = new Columns(); columns.Append(new Column() { Min = 1, Max = 3, Width = 20, CustomWidth = true }); columns.Append(new Column() { Min = 4, Max = 4, Width = 30, CustomWidth = true }); 

在你的示例中,你可以删除以下两行

 Columns columns = new Columns(); worksheetPart.Worksheet.AppendChild(columns); 

第二个问题是你正在使用的StyleIndex ; 该样式不存在于您的文档中,因为您尚未添加它。 最简单的事情就是只删除StyleIndex

在debugging这样的文件时,总是值得关注OpenXml生产力工具 。 您可以在工具中打开生成的文件,并validation它以查看您的文件中有哪些错误。

Excel中的所有文本都存储在共享的string表中。 您需要在共享string表中插入string:

 string text = dataGridView1.Columns[j].Name; cell.DataType = CellValues.SharedString; if (!_spreadSheet.WorkbookPart.GetPartsOfType<SharedStringTablePart>().Any()) { _spreadSheet.WorkbookPart.AddNewPart<SharedStringTablePart>(); } var sharedStringTablePart = _spreadSheet.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First(); if (sharedStringTablePart.SharedStringTable == null) { sharedStringTablePart.SharedStringTable = new SharedStringTable(); } //Iterate through shared string table to check if the value is already present. foreach (SharedStringItem ssItem in sharedStringTablePart.SharedStringTable.Elements<SharedStringItem>()) { if (ssItem.InnerText == text) { cell.CellValue = new CellValue(ssItem.ElementsBefore().Count().ToString()); SaveChanges(); return; } } // The text does not exist in the part. Create the SharedStringItem. var item = sharedStringTablePart.SharedStringTable.AppendChild(new SharedStringItem(new Text(text))); cell.CellValue = new CellValue(item.ElementsBefore().Count().ToString());