将新工作表插入电子表格文档OpenXml

时间:2014-07-16 16:46:20

标签: c# spreadsheet openxml-sdk

我想要做的是使用数据集在工作簿中创建多个工作表我需要从数据集创建工作表数据对象的代码是:

        public static SheetData CreateDataSheet(DataSet ds)
    {
        var xlSheetData = new SheetData();
        if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
        {
            var tbl = ds.Tables[0];
            foreach (DataRow row in tbl.Rows)
            {
                var xlRow = new Row();
                foreach (DataColumn col in tbl.Columns)
                {
                    var cellData = row[col];
                    Cell xlCell = null;
                    if (cellData != null)
                    {
                        xlCell = new Cell(new InlineString(new Text(cellData.ToString())))
                        {
                            DataType = CellValues.InlineString
                        };
                    }
                    else
                    {
                        xlCell = new Cell(new InlineString(new Text(String.Empty)))
                        {
                            DataType = CellValues.InlineString
                        };
                    }
                    xlRow.Append(xlCell);
                }
                xlSheetData.Append(xlRow);
            }
        }
        return xlSheetData;
    }

然后创建电子表格并将上面的内容附加到我的电子表格中:

 public static void CreateSpreadsheetWorkbook(string filepath, List<SheetData> sd)
    {


        var spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook);
        var workbookpart = spreadsheetDocument.AddWorkbookPart();
        workbookpart.Workbook = new Workbook();


        foreach (var x in sd)
        {
            var newWorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorksheetPart>();
            newWorksheetPart.Worksheet = new Worksheet(x);
            var sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());

            uint sheetId = 1;
            if (sheets.Elements<Sheet>().Any())
            {
                sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
            }

            var sheet = new Sheet() { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(newWorksheetPart), SheetId = sheetId, Name = "mySheet" + sheetId };
            sheets.Append(sheet);
            workbookpart.Workbook.Save();

        }

        spreadsheetDocument.Close();

    }

这没有任何错误,但是当我打开文档时,由于它已损坏而无法打开它。

编辑 - 最终工作版本:

public static void CreateSpreadsheetWorkbook(string filepath, List<SheetData> sd)
    {


        var spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook);
        var workbookpart = spreadsheetDocument.AddWorkbookPart();
        workbookpart.Workbook = new Workbook();

        var sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());

        foreach (var x in sd)
        {
            var newWorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorksheetPart>();
            newWorksheetPart.Worksheet = new Worksheet(x);

            sheets = spreadsheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>();

            uint sheetId = 1;
            if (sheets.Elements<Sheet>().Any())
            {
                sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
            }

            var sheet = new Sheet() { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(newWorksheetPart), SheetId = sheetId, Name = "mySheet" + sheetId };
            sheets.Append(sheet);
            workbookpart.Workbook.Save();

        }

        spreadsheetDocument.Close();

    }

1 个答案:

答案 0 :(得分:2)

在与我的一些类似代码比较后,我发现了这些可能存在的问题:

var spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook);

//should be 

var spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.DocumentType);

var sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());

//should be

var sheets = spreadsheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>();

自第二次以来你第一次拥有Sheets元素。

有关详细信息,请参阅此博文: http://blogs.msdn.com/b/brian_jones/archive/2009/02/19/how-to-copy-a-worksheet-within-a-workbook.aspx