如何使用 C# 更新 Excel 数据透视表数据

问题描述

让我概述一下我的要求。我有一个 excel 电子表格,其中包含多个数据透视表(链接到图表/切片器等)和 2 个工作表,其中包含这些数据透视表所引用的数据。目前我必须手动执行 sql 查询,复制数据,将其粘贴到电子表格中的当前数据上,然后每天刷新数据透视表。

这充其量是次优的。所以我想要实现的是一些我可以按计划执行的 C# 代码

使用 EPPlus,我设法将 Excel 文件作为模板加载,创建一个文件,从 sql 获取数据,用新数据更新 2 个数据表,然后保存文件

using (var templateStream = new MemoryStream(File.ReadAllBytes(@"PATH_TO_TEMPLATE_FILE")))
{
    using (var newStream = new MemoryStream())
    {
        //Create e NEW excel doc from the given template
        using (ExcelPackage excelPackage = new ExcelPackage(newStream,templateStream))
        {
            //load the data from sql
            DataSet data = LoadDatasetFromQuery(configs,QueueItem);
            //loop over the DataTables inside the DataSet
            for (int i = 1; i <= data.Tables.Count; i++)
            {
                //Resolve the worksheet to put the data on
                var worksheetName = configs.FirstOrDefault(c => c.Name.StartsWith($"Worksheet.{i}."));
                ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets[worksheetName.Value];
                //Put the data on the worksheet top/left = B3
                worksheet.Cells["B3"].LoadFromDataTable(data.Tables[i - 1],false);
            }
            //Save the file to the memory stream
            excelPackage.Save();
        }

        //Write the file to the file system
        File.WriteallBytes(@"PATH_TO_OUTPUT_FILE",newStream.ToArray());
    }
}

问题是,当我尝试打开 excel 文件时,它说它已损坏并尝试通过完全删除数据透视表来修复它。我的模板文件使用了 in this SO post 中提到的命名范围,但这并没有解决问题。

这是它如何完成“修复”的excel日志

enter image description here

我也尝试过使用互操作库(Microsoft.Office.Interop.Excel),但在调试/文档等方面,这真的就像一个黑洞。我并不反对使用它,我只是不知道如何。 (无论如何,我尝试过的任何东西都无法正常工作)

对上述任何帮助将不胜感激。如果您需要更多信息,请随时询问。

解决方法

好的,看来我上面的代码是正确的,但我加载的 excel 模板是狡猾的。为了解决这个问题,我必须确保所有数据透视表都使用命名范围来引用数据(单击数据透视表上的任意位置,然后单击顶部功能区中的公式选项卡,然后单击名称管理器)源然后按照我上面帖子中的链接中的建议使用偏移量计算(以启用动态范围)。

=OFFSET(DataSource!$A$1,COUNTA(DataSource!$A:$A),COUNTA(DataSource!$1:$1))

其中 DataSource = 包含数据的工作表的名称

最后,我设置了数据透视表以在打开时刷新它们的数据(右键单击数据透视表,转到数据选项卡并勾选“打开时刷新”选项)

当我打开生成的文档时,它处于“受保护模式”,因此数据+计算不会刷新,但如果我只单击“启用编辑”,它会更新所有内容并恢复正常服务,这有点麻烦,快乐的日子!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...