c# - 如何使excel自动计算公式类型单元格

时间:2017-10-26 07:49:12

标签: c# excel excel-interop epplus epplus-4

我有一个excel文件,大约有40到50张大小为8mb,并且可以增加15到20mb,许多与多个公式相互链接。

所以基本上如果一个单元格值发生变化,那么由于函数和vlookup等原因,它会影响多个工作表。

现在我正在尝试使用c#动态操作excel表。但我发现它们并没有立即计算出来。

  1. 我尝试使用ExcelLibrary的Calculate函数来执行此操作。
  2. ExcelLibrary的问题是:

    一个。使用Calculate,ExcelPackage(打开)和保存功能**(使其无法使用)**非常慢。 湾需要知道所有依赖单元格来触发它们的计算(不喜欢工作簿或工作表计算(调试器永远不会到达下一行))这不是管理代码中的代码的有效方法。

    我认为问题是因为它与ooxml一起工作,实际上并不直接使用excel(不确定我们是否可以直接使用excel,因此就像使用代码手动插入数据一样)。

    注意:尝试使用Excel互操作进行测试(希望它能完成这项工作,因为它在操作时会在后台打开excel文件。)

        private void TestExcelWithSimultaneousReadOfTwoSheetsFromFile(string fileName)
    {
        try
        {
            int count = 0;
            int rowIndex = 1702;
            for (int rowCount = 0; rowCount < 3; rowCount++)
            {
                count = ReadCountFromProdReport(fileName);
                WriteRowToProd(fileName, rowIndex + rowCount);
                count = ReadCountFromProdReport(fileName);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    
    private void WriteRowToProd(string fileName, int rowIndex)
    {
        try
        {
            string logDirectory = System.Configuration.ConfigurationManager.AppSettings["LogDirectory"].ToString().Trim();
            string filePath = logDirectory + fileName + ConfigurationManager.AppSettings["ExcelSaveFileExtension"].ToString().Trim();
    
            using (ExcelPackage excelPackage = new ExcelPackage(new FileInfo(filePath)))
            {
                foreach (ExcelWorksheet workSheet in excelPackage.Workbook.Worksheets)
                {
                    if (workSheet.Name.Trim() == "Sample")
                    {
                        workSheet.Cells["C" + rowIndex].Value = "15.05.2017";
                        workSheet.Cells["D" + rowIndex].Value = 21701503;
                        workSheet.Cells["E" + rowIndex].Value = "21701503109W";
                        workSheet.Cells["F" + rowIndex].Value = 304;
                        workSheet.Cells["G" + rowIndex].Value = 200;
                        workSheet.Cells["H" + rowIndex].Value = 1520;
                        workSheet.Cells["I" + rowIndex].Value = 11350;
                        workSheet.Cells["J" + rowIndex].Formula = "=7.85*G1701*H1701*I1701/1000000000";
                        workSheet.Cells["K" + rowIndex].Value = 27.080;
                        excelPackage.Save();
                        break;
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    
    private int ReadCountFromProdReport(string fileName)
    {
        try
        {
            string logDirectory = System.Configuration.ConfigurationManager.AppSettings["LogDirectory"].ToString().Trim();
            string filePath = logDirectory + fileName + ConfigurationManager.AppSettings["ExcelSaveFileExtension"].ToString().Trim();
    
            using (ExcelPackage excelPackage = new ExcelPackage(new FileInfo(filePath)))
            {
                object count = null;
                foreach (ExcelWorksheet workSheet in excelPackage.Workbook.Worksheets)
                {
                    if (workSheet.Name.Trim() == "Report")
                    {
                        count = workSheet.Cells["E23"].Value;
                        break;
                    }
                }
                return Convert.ToInt32(count);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    

0 个答案:

没有答案