【问题标题】:Renaming sheet with a chart, using EPPlus使用 EPPlus 用图表重命名工作表
【发布时间】:2019-09-06 23:12:47
【问题描述】:

我有一个 EPPlus 应用程序,它使用现有的 Excel 工作表作为模板来处理不确定数量的新工作表(数据集的大小会有所不同)。

我正在尝试通过创建新工作表来完成此操作,如下所示:

    ExcelWorksheet templateWs = templateFile.Workbook.Worksheets["Sheet1"];
    ws = ExcelFile.Workbook.Worksheets.Add(string.Format("{0} {1}", "Sample ", sampleID), templateWs);

否则

    ExcelWorksheet templateWs = templateFile.Workbook.Worksheets["Sheet1"];
    ws = ExcelFile.Workbook.Worksheets.Add("Sheet1", templateWs);
    ws.Name = string.Format("{0} {1}", "Sample ", sampleID);

不幸的是,这两者的结果相同:工作表名称更改,但图表中的数据系列引用没有。它继续引用“Sheet1”。

有没有办法解决这个问题?可能以某种方式将图表中的数据系列引用定义为引用“当前工作表”而不是“Sheet1”?还是一些 EPPlus 技巧来更改图表中的工作表参考?

谢谢

【问题讨论】:

    标签: c# excel charts epplus worksheet


    【解决方案1】:

    基于模板的Add 重载不能很好地处理图表。除了之后手动修复它们之外,我还没有见过一个好的解决方案。不漂亮,因为有一些带有图表的边缘案例,这可能是它没有得到应有的发展的原因。

    例如,如果我们使用这里生成的图表:

    How to put two series with different types of charts inside a control chart using Epplus?

    我们在ExcelChart 中有一个ExcelChart 的案例。真是鬼鬼祟祟!因此,要进行正确的复制,您必须遍历图表PlotAreaExcelSeries。因此,在我的回答中使用该测试方法生成的 excel 文件,我们会得到如下内容:

    [TestMethod]
    public void Chart_Template_Rename_Test()
    {
        //https://stackoverflow.com/questions/57829441/renaming-sheet-with-a-chart-using-epplus
    
        var templateFileInfo = new FileInfo(@"C:\temp\Chart_Two_Series.xlsx");
        Assert.IsTrue(templateFileInfo.Exists);
    
        var fileInfo = new FileInfo(@"C:\temp\Chart_Template_Rename_Test.xlsx");
        if (fileInfo.Exists)
            fileInfo.Delete();
    
        using (var templateFile = new ExcelPackage(templateFileInfo))
        using (var ExcelFile = new ExcelPackage(fileInfo))
        {
            ExcelWorksheet ws;
            var sampleID = "Sample1";
            var origWsName = "Content";
    
            ExcelWorksheet templateWs = templateFile.Workbook.Worksheets[origWsName];
            ws = ExcelFile.Workbook.Worksheets.Add(origWsName, templateWs);
            ws.Name = string.Format("{0} {1}", "Sample ", sampleID);
    
            //Look for "top-level" charts
            foreach (var excelDrawing in ws.Drawings)
            {
                if (!(excelDrawing is ExcelChart chart))
                    continue;
    
                //Charts can contain other charts so use plot area to loop through them
                foreach (var chartType in chart.PlotArea.ChartTypes)
                foreach (ExcelChartSerie serie in chartType.Series)
                {
                    serie.Series = serie.Series.Replace(origWsName, ws.Name);
                    serie.XSeries = serie.XSeries.Replace(origWsName, ws.Name);
    
                    if (serie.HeaderAddress != null)
                        serie.HeaderAddress = new ExcelAddressBase(serie
                            .HeaderAddress
                            .Address
                            .Replace(origWsName, ws.Name)
                        );
                }
            }
    
            ExcelFile.Save();
        }
    }
    

    这在新的工作簿工作表中给出了这个(注意最初是“内容”的工作表名称):

    但是,请记住,如果原始 XLXS 已打开并且由 Excel 本身打开,则可能会在处理带有图表的工作表时产生其他问题。同样,必须处理的边缘情况。

    【讨论】:

    • 在帮助我完成任务的意义上不是一个“答案”,但它确实让我有信心说我们不应该尝试将这个功能添加到我们的产品中。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多