我有一个庞大的数据需要使用OpenXML以数据库的形式写入excel。 我从数据库中读取了一组数据(1000行),并第一次写入excel。我循环并读取第二组数据(接下来的1000行),并且必须将它附加到现有的excel行。
using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(destination, true))
{
WorkbookPart workbookPart = spreadSheet.WorkbookPart;
IEnumerable<Sheet> sheets = spreadSheet.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
string relationshipId = sheets.FirstOrDefault(s => string.Compare(s.Name, "Sheet 1", true) == 0).Id;
WorksheetPart worksheetPart = (WorksheetPart)spreadSheet.WorkbookPart.GetPartById(relationshipId);
SheetData sheetData = new SheetData();
DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row();
List<String> columns = new List<string>();
System.Data.DataTable dt = ds.Tables[0];
foreach (DataColumn column in dt.Columns)
{
columns.Add(column.ColumnName);
DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(column.ColumnName);
headerRow.AppendChild(cell);
}
sheetData.AppendChild(headerRow);
foreach (DataRow dsrow in dt.Rows)
{
DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row();
foreach (String col in columns)
{
DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(dsrow[col].ToString());
newRow.AppendChild(cell);
}
sheetData.AppendChild(newRow);
}
worksheetPart.Worksheet.ReplaceChild<SheetData>(sheetData, worksheetPart.Worksheet.Elements<SheetData>().FirstOrDefault());
答案 0 :(得分:0)
我不确定你是如何在微软的SpreadSheetDocument上做的,我使用了一个更简单的第三方DLL,它使用了SpreadSheetDocument并最小化了程序员的工作。
无论如何,如果您知道应该从哪里写入下一组数据的特定行索引,例如在您的情况下为1002(1000行和1行标题)。 (据说保存在Session变量中,或者通过知道在excel表中写入了多少行数据来动态获取起始索引)
我认为你可以做点什么,
int rowIndex = 1002; //This you derive
DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row() { RowIndex = rowIndex };
注意:
开始追加时,只应在循环的第一个实例中考虑{ RowIndex = rowIndex }
。
希望这有帮助。