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

C# 将新工作表插入电子表格文档OpenXml,c#,spreadsheet,openxml-sdk,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) {

我试图做的是使用数据集在工作簿中创建多个工作表我必须从数据集创建图纸数据对象的代码是:

        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();

    }
publicstaticvoid创建电子表格工作簿(字符串文件路径,列表sd)
{
var spreadsheetDocument=spreadsheetDocument.Create(文件路径,SpreadsheetDocumentType.工作簿);
var workbookpart=spreadsheetDocument.AddWorkbookPart();
workbookpart.工作簿=新工作簿();
foreach(sd中的var x)
{
var newWorksheetPart=spreadsheetDocument.WorkbookPart.AddNewPart();
newWorksheetPart.Worksheet=新工作表(x);
var sheets=spreadsheetDocument.WorkbookPart.Workbook.AppendChild(new sheets());
uint sheetId=1;
if(sheets.Elements().Any())
{
sheetId=sheets.Elements()。选择(s=>s.sheetId.Value)。Max()+1;
}
var sheet=new sheet(){Id=spreadsheetDocument.WorkbookPart.GetIdOfPart(newWorksheetPart),SheetId=SheetId,Name=“mySheet”+SheetId};
附页(页);
workbookpart.Workbook.Save();
}
电子表格文档。关闭();
}
这运行时没有任何错误,但是当我打开文档时,它无法打开,因为它已损坏

编辑-最终工作版本:

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();

    }
publicstaticvoid创建电子表格工作簿(字符串文件路径,列表sd)
{
var spreadsheetDocument=spreadsheetDocument.Create(文件路径,SpreadsheetDocumentType.工作簿);
var workbookpart=spreadsheetDocument.AddWorkbookPart();
workbookpart.工作簿=新工作簿();
var sheets=spreadsheetDocument.WorkbookPart.Workbook.AppendChild(new sheets());
foreach(sd中的var x)
{
var newWorksheetPart=spreadsheetDocument.WorkbookPart.AddNewPart();
newWorksheetPart.Worksheet=新工作表(x);
sheets=spreadsheetDocument.WorkbookPart.Workbook.GetFirstChild();
uint sheetId=1;
if(sheets.Elements().Any())
{
sheetId=sheets.Elements()。选择(s=>s.sheetId.Value)。Max()+1;
}
var sheet=new sheet(){Id=spreadsheetDocument.WorkbookPart.GetIdOfPart(newWorksheetPart),SheetId=SheetId,Name=“mySheet”+SheetId};
附页(页);
workbookpart.Workbook.Save();
}
电子表格文档。关闭();
}

在与我的一些类似代码进行比较后,我发现了以下可能的问题:

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

//should be 

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

var sheets=spreadsheetDocument.WorkbookPart.Workbook.AppendChild(new sheets());
//应该是
var sheets=spreadsheetDocument.WorkbookPart.Workbook.GetFirstChild();
第一次之后,到第二次之后,您已经有了
Sheets
元素

有关更多详细信息,请参阅此博客帖子:

如果您需要使用OpenXML,请查看哪一个是OpenXML真正优秀的包装库,它将OpenXML强迫您处理的大量原始连接和开销抽象出来。
var sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());

//should be

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