Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用C更新Excel数据透视表数据#_C#_Excel_Pivot Table_Epplus - Fatal编程技术网

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

C# 如何使用C更新Excel数据透视表数据#,c#,excel,pivot-table,epplus,C#,Excel,Pivot Table,Epplus,让我概述一下我的要求。我有一个excel电子表格,其中包含多个数据透视表(链接到图表/切片器等)和两个工作表,其中包含这些数据透视表引用的数据。目前,我必须手动执行SQL查询,复制数据,将其粘贴到电子表格中的当前数据上,然后每天刷新数据透视表 这充其量是次优的。所以我想实现的是一些我可以按计划执行的C代码 使用EPPlus,我成功地将excel文件作为模板加载,创建一个新文件,从SQL获取数据,用新数据更新两个数据表,然后保存该文件 using (var templateStream = new

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

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

使用EPPlus,我成功地将excel文件作为模板加载,创建一个新文件,从SQL获取数据,用新数据更新两个数据表,然后保存该文件

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());
    }
}
使用(var templateStream=new MemoryStream(File.ReadAllBytes(@“路径到模板文件”))
{
使用(var newStream=newmemoryStream())
{
//从给定模板创建新的excel文档
使用(ExcelPackage ExcelPackage=新的ExcelPackage(newStream、templateStream))
{
//从SQL加载数据
数据集数据=LoadDatasetFromQuery(配置,队列项);
//在数据集中的数据表上循环
对于(inti=1;ic.Name.StartsWith($“工作表{i}”);
ExcelWorksheet工作表=excelPackage.工作簿.Worksheets[worksheetName.Value];
//将数据放在工作表顶部/左侧=B3
工作表.Cells[“B3”].LoadFromDataTable(data.Tables[i-1],false);
}
//将文件保存到内存流中
excelPackage.Save();
}
//将文件写入文件系统
writealBytes(@“路径到输出文件”,newStream.ToArray());
}
}
问题是,当我尝试打开excel文件时,它说它已损坏,并试图修复它,实际上,它是通过完全删除透视表来修复的。我的模板文件使用了前面提到的命名范围,但这并没有解决问题

随函附上其如何完成“修复”的excel日志

我在使用interop库(Microsoft.Office.interop.Excel)方面也涉猎过一点,但在调试/文档等方面,这就像一个黑洞。我并不反对使用它,只是不知道如何使用。(不管怎样,我试过的东西都不能正常工作)


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

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

=偏移量(数据源!$A$1,0,0,COUNTA(数据源!$A:$A),COUNTA(数据源!$1:$1))

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

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


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

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

=偏移量(数据源!$A$1,0,0,COUNTA(数据源!$A:$A),COUNTA(数据源!$1:$1))

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

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


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

条件格式是否适用于此方法?条件格式是否适用于此方法?