我正在代码中创建一个Excel工作簿,并将其另存为XLSX和PDF。我使用了一个模板工作簿,它具有格式化和公式,在生成完成后进行评估。当我打开Excel文件时,公式仅在我将ForceFormulaRecalculation
设置为true时进行评估。当我对PDF文件执行相同操作时,我得到结果应该是#VALUE!
。我的相关代码:
ReportGenerator generator = new ReportGenerator();
List<Activity> activities = GetActivitiesForItemCollection(items);
generator.CreateWorkbook(templatePath);
generator.Year = int.Parse(year);
generator.Month = int.Parse(month);
activities = generator.SortActivitiesByDateTime(activities);
activities = generator.GenerateBreaksForProject(activities);
bool isExternalReport = false;
if (project == "Intern")
isExternalReport = true;
generator.GenerateReports(activities, isExternalReport);
if (pdf && !xlsx)
generator.SaveReportToList(OutputFileType.PDF, generator.AssembleFileName(UserProperties.FullName, project, month, year, OutputFileType.PDF));
else if (xlsx && !pdf)
generator.SaveReportToList(OutputFileType.XLSX, generator.AssembleFileName(UserProperties.FullName, project, month, year, OutputFileType.XLSX));
else
{
generator.SaveReportToList(OutputFileType.XLSX, generator.AssembleFileName(UserProperties.FullName, project, month, year, OutputFileType.XLSX));
generator.SaveReportToList(OutputFileType.PDF, generator.AssembleFileName(UserProperties.FullName, project, month, year, OutputFileType.PDF));
}
以下是我进行评估的代码:
public void SaveReportToList(OutputFileType outputType, string filename)
{
string siteUrl = SPContext.Current.Web.Url;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (MemoryStream mStream = new MemoryStream())
{
sheet.PrintSetup.Landscape = true;
sheet.PrintSetup.FitWidth = 1;
sheet.PrintSetup.FitHeight = 1;
XSSFFormulaEvaluator.EvaluateAllFormulaCells(workbook);
workbook.Write(mStream);
using (MemoryStream crutchStream = new MemoryStream(mStream.ToArray()))
{
using (SPSite spsite = new SPSite(siteUrl))
{
using (SPWeb spweb = spsite.OpenWeb())
{
....
我也是这样试过的:
private void ForceCalculateSheet()
{
XSSFFormulaEvaluator helper = (XSSFFormulaEvaluator)workbook.GetCreationHelper().CreateFormulaEvaluator();
for(int i = 0; i<sheet.LastRowNum; i++)
{
XSSFRow row = (XSSFRow)sheet.GetRow(i);
for(int j = 0; j< row.LastCellNum; j++)
{
XSSFCell cell = (XSSFCell)row.GetCell(j);
if(cell != null && cell.CellType == CellType.Formula)
{
helper.EvaluateFormulaCell(cell);
}
}
}
}
以下是我尝试评估的几个公式(某些单元格值是24小时时间值):
=IF(D37-C37-E37>0;D37-C37-E37;0)
=INT(J39/60)
=J39-C39*60
奇怪的是,当我在Excel中跟踪评估时,它会一直持续到最后一步。然后突然该值变为#VALUE!
。
任何人都知道这里发生了什么?
为了小心,我将NPOI更新为最新的.NET版本(2.1.3.1)。这仍然没有解决问题。
当我单击公式中的单元格时,更改其值,然后按Enter确认,公式将正确评估。这意味着公式本身不应该有任何问题。
我通过手动进行计算解决了这个问题。这不是我的长期解决方案,因为用户应该能够插入自己的计算,但它是我现在能够提出的唯一解决方案,除了使用另一个Excel框架(糟糕的计划;))。