使用OpenXml以块的形式将数据写入excel并附加到现有行

时间:2015-09-08 09:46:59

标签: excel append openxml

我有一个庞大的数据需要使用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());            

1 个答案:

答案 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 }

希望这有帮助。