Vb.net EPPlus无法设置公式。相反,它破坏了XML公式

Vb.net EPPlus无法设置公式。相反,它破坏了XML公式,vb.net,epplus,Vb.net,Epplus,当我试图通过EPPlus在现有Excel文件中设置单元格公式时,Excel文档已损坏。Excel抛出“我们发现“Excel.xlsx”中的某些内容有问题。是否希望我们尽可能多地恢复?如果您信任此工作簿的来源,请单击“是”。“对话框,然后显示“已删除记录:公式自/xl/worksheets/sheet1.xml部分” 如果我注释掉公式集操作,错误就会消失,但它会填充我在代码中没有要求的公式 我有一个excel文件和几张表格。在一张工作表中,我想在L列中设置一个值,在I、J和M列中设置公式。如果我在

当我试图通过EPPlus在现有Excel文件中设置单元格公式时,Excel文档已损坏。Excel抛出“我们发现“Excel.xlsx”中的某些内容有问题。是否希望我们尽可能多地恢复?如果您信任此工作簿的来源,请单击“是”。“对话框,然后显示“已删除记录:公式自/xl/worksheets/sheet1.xml部分”

如果我注释掉公式集操作,错误就会消失,但它会填充我在代码中没有要求的公式

我有一个excel文件和几张表格。在一张工作表中,我想在L列中设置一个值,在I、J和M列中设置公式。如果我在Excel中手动执行此操作,则所有操作都不会出错。但是,当我尝试将其自动化时,会收到错误消息并丢失公式

预期配方:

第一列的公式:
=IFNA(VLOOKUP([@[SQL Server]],SqlVersions!$C:$R,12,TRUE),“-”

J列的公式:
=IFNA(VLOOKUP([@[SQL Server]],SqlVersions!$C:$S,17,TRUE),“--”

列M的公式:
=IFNA(VLOOKUP([@[SQL Server]],SqlVersions!$C:$R,8,TRUE),“--”)

Dim Hdr As String=“”
dim serverData as New List(字符串)类似于A1 | | ServerName的数据列表
“剪/剪”
Dim fInfo作为新文件信息(excelFile)
将ePack用作新的ExcelPackage(fInfo)
将mySheet设置为Excel工作表=无
“找到我们需要的床单。
将每张工作表作为ePack.工作簿.Worksheets中的Excel工作表
如果sheet.Name=ExcelServers,则
我的工作表=工作表
退出
如果结束
下一个
如果IsNothing(mySheet),则抛出新异常(“未找到服务器工作表”)
对于ServerData中的每个serverRow
如果IsNothing(serverRow)或lse InStr(serverRow,“| |”)=0,则继续“跳过”空白行
Dim Cell()作为字符串=拆分(serverRow,“| |”)
Dim CellAddress作为字符串=单元格(0)'A1..A50
Dim CellValue为String=Trim(单元格(1))'服务器名或表头
Dim CellAddressCol As String=Left(CellAddress,1)”将始终是一个
Dim CellAddressRow为整数=CellAddress。子字符串(1)编号,1-50
如果CellValue=“Oracle服务器”,则
Hdr=“Ora”'我们找到了Oracle服务器的列表
继续“向前跳到下一个值”
ElseIf CellValue=“SQL Server”然后
Hdr=“Sql”'我们已经完成了与Oracle的合作,转而使用Sql Server服务器
继续“向前跳到下一个值”
ElseIf CellValue=“非DB服务器”然后
退出“我们所有的工作都完成了”。
如果结束
如果Hdr=“Ora”,则
如果Len(CellValue)<2,则
mySheet.Cells(“L”和CellAddressRow).Value=“”
其他的
mySheet.Cells(“L”和CellAddressRow).Value=“P”
如果结束
ElseIf Hdr=“Sql”然后
如果Len(CellValue)<2,则
mySheet.Cells(“I”和CellAddressRow).Value=“”
mySheet.Cells(“J”和CellAddressRow).Value=“”
mySheet.Cells(“L”和CellAddressRow).Value=“”
mySheet.Cells(“M”和CellAddressRow).Value=“”
ElseIf CellValue=“Cluster1”或CellValue=“Cluster2”则
mySheet.Cells(“I”和CellAddressRow).Value=“”
mySheet.Cells(“J”和CellAddressRow).Value=“”
mySheet.Cells(“L”和CellAddressRow).Value=“C”
mySheet.Cells(“M”和CellAddressRow).Value=“”
Else的数据行。
mySheet.Cells(“I”和CellAddressRow).Formula=“IFNA(VLOOKUP([@[SQL Server]],SqlVersions!$C:$R,12,TRUE),”“--”)
mySheet.Cells(“J”和CellAddressRow).Formula=“IFNA(VLOOKUP([@[SQL Server]],SqlVersions!$C:$S,17,TRUE),”“--”)
mySheet.Cells(“L”和CellAddressRow).Value=“V”
mySheet.Cells(“M”和CellAddressRow).Formula=“ifNA(VLOOKUP([@[SQL Server]],SqlVersions!$C:$R,8,FALSE),”“--”)
如果“/空行”结束?集群行?其他服务器行?
如果“/Oracle或SQL”结束?
下一个
ePack.Save()
终端使用
我希望得到一系列行,“Oracle”后面的行在列L中得到一个“p”,而“SQL Server”后面的行在列I、J和M中有查找公式,在列L中有一个“V”

如果我将.Formula=代码保留在适当的位置,就会得到错误。如果我注释掉.Formula行,则Oracle行的公式为“=70+65”,SQL Server行的公式为“=159+799”

最终结果应该如下所示: (请注意,Oracle行和两个标题行只是文本,不受此代码的修改。)

Oracle Server,,,,,,,,版本,修补程序,P V或C,生命周期结束 Oracle1,12.2.0.127937914,P, 甲骨文,12.2.0.127937914,P, ,,,,,,,, Sql Server,,,,,,,,版本,修补程序,P V或C,生命周期结束 集群1,,,,,,,,,,,C,2026年7月14日 组2,,,,,,,,,,C, Sql1,,,,,,,2016 Ent 13.0.5337,SP2 CU7更新,版本,2027年10月12日 Sql2,,,,,,,2017 Ent 14.0.3223,CU16,V,2026年7月14日 [...] sql32,,,,,,,2016 Ent 13.0.5426,SP2 CU8,,V,7/14/2016 ,,,,,,,, 非数据库服务器,,,,,,,, 但在我接受错误消息请求修复后,我得到的是:

Oracle Server,,,,,,,,Version,Patch,,P V or C, End of Life Oracle1,,,,,,,,12.2.0.1,27937914,,135, Oracle,,,,,,,,12.2.0.1,27937914,,135, ,,,,,,,,,,,135 Sql Server,,,,,,,,Version,Patch,,P V or C,End of Life Cluster1,,,,,,,,,,958,#N/A Cluster2,,,,,,,,,,958,#N/A Sql1,,,,,,,,,,958,10/12/2027 Sql2,,,,,,,,,,958,7/14/2026 [...] sql32,,,,,,,,,,958,7/14/2016 ,,,,,,,,,,958,#N/A Non-DB Servers,,,,,,,, Oracle Server,,,,,,,,版本,修补程序,P V或C,生命周期结束 Oracle1,12.2.0.127937914,135, 甲骨文,12.2.0.127937914,135, ,,,,,,,,,,,135 Sql Server,,,,,,,,版本,修补程序,P V或C,生命周期结束 集群1,,,,,,,,958,#不适用 集群2,,,,,,,,958,#不适用 Sql1,,,,,,,,,958,10/12/2027 Sql2,,,,,,,,,958,7/14/2026 [...] sql32,,,,,,,,,958,7/14/2016 不适用 非数据库服务器,,,,,,,, 我根本不知道这些公式是从哪里来的,因为它们永远都不在我的代码中

编辑

以下是实际服务器名称的删除

这是代码离开时的(也擦洗过的)。

当我打开并
save()
您需要的示例时 Oracle Server,,,,,,,,Version,Patch,,P V or C, End of Life Oracle1,,,,,,,,12.2.0.1,27937914,,P, Oracle,,,,,,,,12.2.0.1,27937914,,P, ,,,,,,,, Sql Server,,,,,,,,Version,Patch,,P V or C,End of Life Cluster1,,,,,,,,,,,C,7/14/2026 Cluster2,,,,,,,,,,C, Sql1,,,,,,,2016 Ent 13.0.5337,SP2 CU7 Up,,V,10/12/2027 Sql2,,,,,,,2017 Ent 14.0.3223,CU16,,V,7/14/2026 [...] sql32,,,,,,,2016 Ent 13.0.5426,SP2 CU8,,V,7/14/2016 ,,,,,,,, Non-DB Servers,,,,,,,, Oracle Server,,,,,,,,Version,Patch,,P V or C, End of Life Oracle1,,,,,,,,12.2.0.1,27937914,,135, Oracle,,,,,,,,12.2.0.1,27937914,,135, ,,,,,,,,,,,135 Sql Server,,,,,,,,Version,Patch,,P V or C,End of Life Cluster1,,,,,,,,,,958,#N/A Cluster2,,,,,,,,,,958,#N/A Sql1,,,,,,,,,,958,10/12/2027 Sql2,,,,,,,,,,958,7/14/2026 [...] sql32,,,,,,,,,,958,7/14/2016 ,,,,,,,,,,958,#N/A Non-DB Servers,,,,,,,,
=VLOOKUP(A2,Data!A:B,2,FALSE)
=VLOOKUP(A2,Data!A:B:B,2,FALSE)