C# OpenXML创建";表/透视表“;动态地

C# OpenXML创建";表/透视表“;动态地,c#,.net,excel,openxml,openxml-sdk,C#,.net,Excel,Openxml,Openxml Sdk,我正在创建一个在内存中生成excel的示例程序。 程序已经生成了excel,但是我不能让表格工作 节目: public class Program { static void Main(string[] args) { CreateCurrentAccount(); } static void CreateCurrentAccount() { byte[] _buffer = ExcelGenerator.CurrentA

我正在创建一个在内存中生成excel的示例程序。 程序已经生成了excel,但是我不能让表格工作

节目:

public class Program
{
    static void Main(string[] args)
    {
        CreateCurrentAccount();
    }

    static void CreateCurrentAccount()
    {
        byte[] _buffer = ExcelGenerator.CurrentAccount.GetExcel();
        File.WriteAllBytes("CurrentAccount.xlsx", _buffer);
    }
}
ExcelGenerator类别:

public class ExcelGenerator
{
    static uint? _generalStyle = 0;
    static uint? _dateStyle = 1;
    static uint? _currencyStyle = 2;
    static uint? _percentageStyle = 3;
    static int maxStyleSheetName = 31;

    public static class CurrentAccount
    {
        static uint? _headerStyle = 4;
        static uint? _tableHeaderStyle = 5;
        static uint? _totalHeaderStyle = 6;

        public static byte[] GetExcel()
        {
            using (MemoryStream ms = new MemoryStream())
            {
                SpreadsheetDocument spreadsheet;
                Worksheet worksheet;

                spreadsheet = OpenXML.CreateWorkbook(ms);

                // styles
                OpenXML.AddBasicStyles(spreadsheet);
                AddAdvancedStyles(spreadsheet);

                string styleSheetName = ("Conta Corrente" /* + customer.Name*/);
                OpenXML.AddWorksheet(spreadsheet, styleSheetName.Length > maxStyleSheetName ? styleSheetName.Substring(0, maxStyleSheetName) : styleSheetName);
                worksheet = spreadsheet.WorkbookPart.WorksheetParts.First().Worksheet;

                // Sheet 1 Header
                OpenXML.MergeTwoCells(worksheet, "A1", "F1");
                OpenXML.SetCellValue(spreadsheet, worksheet, 1, 1, CellValues.String, "Conta Corrente", _headerStyle, true);

                // Header Table
                OpenXML.SetCellValue(spreadsheet, worksheet, 1, 3, CellValues.String, "Tipo de Doc.", _tableHeaderStyle, true);
                OpenXML.SetCellValue(spreadsheet, worksheet, 2, 3, CellValues.String, "Nr. Doc.", _tableHeaderStyle, true);
                OpenXML.SetCellValue(spreadsheet, worksheet, 3, 3, CellValues.String, "Valor Doc.", _tableHeaderStyle, true);
                OpenXML.SetCellValue(spreadsheet, worksheet, 4, 3, CellValues.String, "Valor Pendente", _tableHeaderStyle, true);
                OpenXML.SetCellValue(spreadsheet, worksheet, 5, 3, CellValues.String, "Data Registo", _tableHeaderStyle, true);
                OpenXML.SetCellValue(spreadsheet, worksheet, 6, 3, CellValues.String, "Data Vencimento", _tableHeaderStyle, true);

                // Table
                var currentAccountData = GetData();

                uint rowIdx = 4;
                foreach (var item in currentAccountData)
                {
                    OpenXML.SetCellValue(spreadsheet, worksheet, 1, rowIdx, CellValues.String, item.TypeDoc, _generalStyle, true);
                    OpenXML.SetCellValue(spreadsheet, worksheet, 2, rowIdx, CellValues.String, item.NrDoc, _generalStyle, true);
                    if (item.DocValue != null)
                        OpenXML.SetCellValue(spreadsheet, worksheet, 3, rowIdx, Convert.ToDouble(item.DocValue), _currencyStyle, true);
                    if (item.PendingValue != null)
                        OpenXML.SetCellValue(spreadsheet, worksheet, 4, rowIdx, Convert.ToDouble(item.PendingValue), _currencyStyle, true);
                    if (item.RecordDate != null)
                        OpenXML.SetCellValue(spreadsheet, worksheet, 5, rowIdx, item.RecordDate, _dateStyle, true);
                    if (item.SalaryDate != null)
                        OpenXML.SetCellValue(spreadsheet, worksheet, 6, rowIdx, item.SalaryDate, _dateStyle, true);

                    rowIdx++;
                }

                TableParts tableParts1 = new TableParts() { Count = (uint)1U };
                TablePart tablePart1 = new TablePart() { Id = "rId1" };
                tableParts1.Append(tablePart1);
                worksheet.Append(tableParts1);

                OpenXML.CreateTable(spreadsheet, worksheet, "table1", 3U, 1U, (uint)currentAccountData.Count + 3, 6U);
                TableDefinitionPart tableDefinitionPart1 = worksheet.WorksheetPart.TableDefinitionParts.FirstOrDefault<TableDefinitionPart>();

                // Total
                OpenXML.SetCellValue(spreadsheet, worksheet, 8, 2, CellValues.String, "Total Documento", _totalHeaderStyle, true);
                OpenXML.SetCellFormula(spreadsheet, worksheet, 9, 2, "=SUM(C4:C1048576)", 2, true);

                OpenXML.SetCellValue(spreadsheet, worksheet, 8, 3, CellValues.String, "Total Pendente", _totalHeaderStyle, true);
                OpenXML.SetCellFormula(spreadsheet, worksheet, 9, 3, "=SUM(D4:D1048576)", 2, true);

                // Last Sync
                var lastSync = DateTime.Now;
                OpenXML.SetCellValue(spreadsheet, worksheet, 8, 1, CellValues.String, "Última Sincronização", _totalHeaderStyle, true);
                OpenXML.SetCellValue(spreadsheet, worksheet, 9, 1, lastSync, _dateStyle, true);

                // Set column widths
                OpenXML.SetColumnWidth(worksheet, 1, 22);
                OpenXML.SetColumnWidth(worksheet, 2, 22);
                OpenXML.SetColumnWidth(worksheet, 3, 22);
                OpenXML.SetColumnWidth(worksheet, 4, 22);
                OpenXML.SetColumnWidth(worksheet, 5, 22);
                OpenXML.SetColumnWidth(worksheet, 6, 22);

                OpenXML.SetColumnWidth(worksheet, 8, 22);
                OpenXML.SetColumnWidth(worksheet, 9, 22);

                worksheet.Save();
                spreadsheet.Close();

                return ms.ToArray();
            }
        }
    }
}
然后创建tablepart

TableParts tableParts1 = new TableParts() { Count = (uint)1U };
TablePart tablePart1 = new TablePart() { Id = "rId1" };
tableParts1.Append(tablePart1);
worksheet.Append(tableParts1);
之后,我使用OpenXML.CreateTable方法

OpenXML.CreateTable(spreadsheet, worksheet, "table1", 3U, 1U, (uint)currentAccountData.Count + 3, 6U);
我做错了什么

如果你需要更多的代码,我会上传应用程序。 多谢各位

编辑:

当我打开excel时,它会显示:

已删除部件:/xl/tables/table.xml带有xml错误的部件。(表)A 文档必须只包含一个根元素。第1行第0列

我做错了什么

在我看来,您的调试方法是错误的。我建议采取以下措施之一:

  • a。将生成的xml与手工制作的xlsx文件进行比较
  • b。从代码开始,由OpenXML生产力工具生成(因此 在应用程序中生成静态表)并对其进行修改/重新因子化 一步一步地使用应用程序中的动态数据,并与编码标准相匹配——这样您就可以发现您的 在一次迭代中出错,或者只是得到一个干净的工作解决方案

发生了什么或没有发生什么?你有错误吗?上面说什么?您是否尝试过在要创建的工作簿模型中使用开放式XML生产力工具?它将为您提供构造这样一个工作簿的代码。@MichaelGunter抱歉,michael,我忘了发布错误。。。我使用producivity工具来检查这些表是如何创建的。代码与此类似,但不适用于此示例。在我看来,TablePart(tablePart1)需要一些内容,但您没有提供这些内容(生成的XML没有根元素)。@MichaelGunter我就是这么认为的。。。然而,通过生产力工具生成的TablePart并没有得到任何东西,但它是有效的。生成的类Excel:很抱歉将其发布到另一个站点。@MichaelCounter好吧,如果我删除tablepart,它不会给出任何错误,但表也不会创建
TableParts tableParts1 = new TableParts() { Count = (uint)1U };
TablePart tablePart1 = new TablePart() { Id = "rId1" };
tableParts1.Append(tablePart1);
worksheet.Append(tableParts1);
OpenXML.CreateTable(spreadsheet, worksheet, "table1", 3U, 1U, (uint)currentAccountData.Count + 3, 6U);