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

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

    }

最佳答案

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

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

关于c# - 将新工作表插入电子表格文档 OpenXml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24786315/

相关文章:

c# - Apache Ignite.NET LINQ 失败

c# - 具有日期格式 dd/MM/yy 的 DateTime.TryParseExact 或 Convert.ToDateTime() 的范围是多少

xml - downloadAsFile(谷歌的内容服务)不工作

c# - 如何使用 C# 从 word 文档中的表中读取值

使用 OpenXML SDK 创建文档时 OpenXML Powertools HtmlConverter 失败

c# - Azure Functions 是否适合拆分大型处理作业?

Google SpreadSheet 的 Java 纪元日期

json - 电子表格问题

openxml - 将字节数组中的图像插入 OpenXML CustomXmlBlock

c# - 将 int 转换为 6 个字符的字母数字字符串的算法