Vb.net EPPlus无法设置公式。相反,它破坏了XML公式
当我试图通过EPPlus在现有Excel文件中设置单元格公式时,Excel文档已损坏。Excel抛出“我们发现“Excel.xlsx”中的某些内容有问题。是否希望我们尽可能多地恢复?如果您信任此工作簿的来源,请单击“是”。“对话框,然后显示“已删除记录:公式自/xl/worksheets/sheet1.xml部分” 如果我注释掉公式集操作,错误就会消失,但它会填充我在代码中没有要求的公式 我有一个excel文件和几张表格。在一张工作表中,我想在L列中设置一个值,在I、J和M列中设置公式。如果我在Excel中手动执行此操作,则所有操作都不会出错。但是,当我尝试将其自动化时,会收到错误消息并丢失公式 预期配方: 第一列的公式: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列中设置公式。如果我在
=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)