OpenXML Spreadsheet:Excel提供了一个错误,然后修复它,它工作。 (C#)

我缩小到:

//aantal auto's Row aantalAutosRow = new Row(); aantalAutosRow.RowIndex = Convert.ToUInt32((tblXML.Rows.Count) + 2); Cell aantalAutosCell = new Cell(); aantalAutosCell.CellReference = getColumnName(1); aantalAutosCell.CellValue = new CellValue("Hoi"); aantalAutosRow.Append(aantalAutosCell); sheetData.Append(aantalAutosRow); 

当Excel提示修复文件(sheet.xml)时,单击“是”后,将生成“单元格”

完整的课程:

  using System; using System.Collections.Generic; using System.Linq; using System.Text; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using System.IO; using System.Xml; using System.Data; namespace XML_naar_Excel { class Excel { public void convertToExcel(string padXml) { //maak dataset en vul met ingevoerde xml DataSet dsXML = new DataSet(); dsXML.ReadXml(padXml); DataTable tblXML = dsXML.Tables[2]; //opslaan string padXlsx = Path.GetDirectoryName(padXml) + "\\voorraad " + DateTime.Now.Day + "-" + DateTime.Now.Month + "-" + DateTime.Now.Year + ".xlsx"; //spreadsheet using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(padXlsx, SpreadsheetDocumentType.Workbook)) { WorkbookPart workbookPart = spreadsheetDocument.AddWorkbookPart(); WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); Workbook workbook = new Workbook(); FileVersion fv = new FileVersion(); fv.ApplicationName = "Microsoft Office Excel"; Worksheet worksheet = new Worksheet(); SheetData sheetData = new SheetData(); //styles Style s = new Style(); WorkbookStylesPart stylesPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorkbookStylesPart>(); stylesPart.Stylesheet = s.GenerateStyleSheet(); stylesPart.Stylesheet.Save(); //kolommen Columns columns = new Columns(); for (int i = 1; i < tblXML.Columns.Count; i++) { Column column = new Column(); column.Min = Convert.ToUInt32(i); column.Max = Convert.ToUInt32(i + 1); int lengte = tblXML.Rows[13][i-1].ToString().Length; if (lengte < 10) { lengte = 10; } else if (lengte > 35) { lengte = 35; } else { lengte += 5; } column.Width = lengte; column.BestFit = true; columns.Append(column); } worksheet.Append(columns); //header Row header = new Row(); header.RowIndex = (UInt32)1; foreach (DataColumn columnInDataTable in tblXML.Columns) { Cell headerCell = createTextCell(tblXML.Columns.IndexOf(columnInDataTable) + 1, 1, columnInDataTable.ColumnName); headerCell.StyleIndex = 1; header.AppendChild(headerCell); } sheetData.AppendChild(header); // Add a row to the cell table. for (int i = 1; i < tblXML.Rows.Count; i++) { Row row; row = new Row() { RowIndex = Convert.ToUInt32(i) + 1 }; for (int j = 0; j < tblXML.Columns.Count; j++) { Cell newCell = new Cell() { CellReference = getColumnName(i), DataType = CellValues.String, StyleIndex = 6, CellValue = new CellValue(tblXML.Rows[i][j].ToString()), }; row.Append(newCell); } sheetData.Append(row); } //autofilter string laatsteKolom = zoekLaatsteKolom(tblXML); AutoFilter autoFilter = new AutoFilter(); autoFilter.Reference = "A1:" + laatsteKolom + "1"; //aantal auto's Row aantalAutosRow = new Row(); aantalAutosRow.RowIndex = Convert.ToUInt32((tblXML.Rows.Count) + 2); Cell aantalAutosCell = new Cell(); aantalAutosCell.CellReference = getColumnName(1); aantalAutosCell.CellValue = new CellValue("Hoi"); //CellFormula berekenAantalAutos = new CellFormula(); //berekenAantalAutos.Text = "=COUNTA(A2:A" + tblXML.Rows.Count.ToString(); //aantalAutosCell.Append(berekenAantalAutos); aantalAutosRow.Append(aantalAutosCell); sheetData.Append(aantalAutosRow); worksheet.Append(sheetData); worksheet.Append(autoFilter); worksheetPart.Worksheet = worksheet; worksheetPart.Worksheet.Save(); Sheets sheets = new Sheets(); Sheet sheet = new Sheet(); sheet.Name = "Voorraad"; sheet.SheetId = 1; sheet.Id = workbookPart.GetIdOfPart(worksheetPart); sheets.Append(sheet); workbook.Append(fv); workbook.Append(sheets); spreadsheetDocument.WorkbookPart.Workbook = workbook; spreadsheetDocument.WorkbookPart.Workbook.Save(); spreadsheetDocument.Close(); } } //kolom naam (letter) ophalen private string getColumnName(int columnIndex) { int dividend = columnIndex; string columnName = String.Empty; int modifier; while (dividend > 0) { modifier = (dividend - 1) % 26; columnName = Convert.ToChar(65 + modifier).ToString() + columnName; dividend = (int)((dividend - modifier) / 26); } return columnName; } private Cell createTextCell(int columnIndex, int rowIndex, object cellValue) { Cell cell = new Cell(); cell.DataType = CellValues.InlineString; cell.CellReference = getColumnName(columnIndex) + rowIndex; InlineString inlineString = new InlineString(); Text t = new Text(); t.Text = cellValue.ToString(); inlineString.AppendChild(t); cell.AppendChild(inlineString); return cell; } string zoekLaatsteKolom(DataTable tblXML) { string kolom; kolom = getColumnName(tblXML.Columns.Count); return kolom; } } } 

有人可以告诉我,我在做什么,这是违法的Excel? 我认为excel使得修复SharedStrings成为可能。 我从来没有与SharedStrings工作,我希望我不必。

我浏览了你的代码,发现了4个需要改变的地方,以便生成一个无错的excel文档。

  • 1.replacestylesPart.Stylesheet = s.GenerateStyleSheet(); stylesPart.Stylesheet = new Stylesheet();
  • 2.注释如下: //headerCell.StyleIndex = 1;
  • 3.注释如下: //StyleIndex = 6,
  • 4.添加了以下内容: aantalAutosCell.DataType = CellValues.String;
  • 下面的代码适用于我,并生成一个无错误的Excel文档。 几个你需要知道的指针

  • 1.在使用Open XML Docs时,不能任意指定样式索引
  • 2.当你有一个string数据types被存储时,你应该使用CellValues.String(因为你不想使用共享string)
  • 3.使用Open XML SDK时阅读SharedStrings是非常值得的。 共享string减less文件的整体大小,让事情变得更好。 请参阅http://msdn.microsoft.com/en-us/library/office/gg278314.aspx
  •  using System; using System.Data; using System.IO; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using DocumentFormat.OpenXml; namespace TestOpenXmlSDK { class Excel { public void convertToExcel(string padXml) { //maak dataset en vul met ingevoerde xml DataSet dsXML = new DataSet(); dsXML.ReadXml(padXml); DataTable tblXML = dsXML.Tables[2]; //opslaan string padXlsx = Path.GetDirectoryName(padXml) + DateTime.Now.Day + "-" + DateTime.Now.Month + "-" + DateTime.Now.Year + ".xlsx"; //spreadsheet using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(padXlsx, SpreadsheetDocumentType.Workbook)) { WorkbookPart workbookPart = spreadsheetDocument.AddWorkbookPart(); WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); Workbook workbook = new Workbook(); FileVersion fv = new FileVersion(); fv.ApplicationName = "Microsoft Office Excel"; Worksheet worksheet = new Worksheet(); SheetData sheetData = new SheetData(); //styles WorkbookStylesPart stylesPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorkbookStylesPart>(); stylesPart.Stylesheet = new Stylesheet(); stylesPart.Stylesheet.Save(); //kolommen DocumentFormat.OpenXml.Spreadsheet.Columns columns = new Columns(); for (int i = 1; i < tblXML.Columns.Count; i++) { Column column = new Column(); column.Min = Convert.ToUInt32(i); column.Max = Convert.ToUInt32(i + 1); int lengte = tblXML.Rows[13][i - 1].ToString().Length; if (lengte < 10) { lengte = 10; } else if (lengte > 35) { lengte = 35; } else { lengte += 5; } column.Width = lengte; column.BestFit = true; columns.Append(column); } worksheet.Append(columns); //header Row header = new Row(); header.RowIndex = (UInt32)1; foreach (DataColumn columnInDataTable in tblXML.Columns) { Cell headerCell = createTextCell(tblXML.Columns.IndexOf(columnInDataTable) + 1, 1, columnInDataTable.ColumnName); //headerCell.StyleIndex = 1; header.AppendChild(headerCell); } sheetData.AppendChild(header); // Add a row to the cell table. for (int i = 1; i < tblXML.Rows.Count; i++) { Row row; row = new Row() { RowIndex = Convert.ToUInt32(i) + 1 }; for (int j = 0; j < tblXML.Columns.Count; j++) { Cell newCell = new Cell() { CellReference = getColumnName(i), DataType = CellValues.Number, //StyleIndex = 6, CellValue = new CellValue(tblXML.Rows[i][j].ToString()), }; row.Append(newCell); } sheetData.Append(row); } //autofilter string laatsteKolom = zoekLaatsteKolom(tblXML); AutoFilter autoFilter = new AutoFilter(); autoFilter.Reference = "A1:" + laatsteKolom + "1"; //aantal auto's Row aantalAutosRow = new Row(); aantalAutosRow.RowIndex = Convert.ToUInt32((tblXML.Rows.Count) + 2); Cell aantalAutosCell = new Cell(); aantalAutosCell.CellReference = getColumnName(1); aantalAutosCell.CellValue = new CellValue("Hoi"); aantalAutosCell.DataType = CellValues.String; //CellFormula berekenAantalAutos = new CellFormula(); //berekenAantalAutos.Text = "=COUNTA(A2:A" + tblXML.Rows.Count.ToString(); //aantalAutosCell.Append(berekenAantalAutos); aantalAutosRow.Append(aantalAutosCell); sheetData.Append(aantalAutosRow); worksheet.Append(sheetData); worksheet.Append(autoFilter); worksheetPart.Worksheet = worksheet; worksheetPart.Worksheet.Save(); Sheets sheets = new Sheets(); Sheet sheet = new Sheet(); sheet.Name = "Voorraad"; sheet.SheetId = 1; sheet.Id = workbookPart.GetIdOfPart(worksheetPart); sheets.Append(sheet); workbook.Append(fv); workbook.Append(sheets); spreadsheetDocument.WorkbookPart.Workbook = workbook; spreadsheetDocument.WorkbookPart.Workbook.Save(); spreadsheetDocument.Close(); } } //kolom naam (letter) ophalen private string getColumnName(int columnIndex) { int dividend = columnIndex; string columnName = String.Empty; int modifier; while (dividend > 0) { modifier = (dividend - 1) % 26; columnName = Convert.ToChar(65 + modifier).ToString() + columnName; dividend = (int)((dividend - modifier) / 26); } return columnName; } private Cell createTextCell(int columnIndex, int rowIndex, object cellValue) { Cell cell = new Cell(); cell.DataType = CellValues.InlineString; cell.CellReference = getColumnName(columnIndex) + rowIndex; InlineString inlineString = new InlineString(); Text t = new Text(); t.Text = cellValue.ToString(); inlineString.AppendChild(t); cell.AppendChild(inlineString); return cell; } string zoekLaatsteKolom(DataTable tblXML) { string kolom; kolom = getColumnName(tblXML.Columns.Count); return kolom; } } }