Azure App Service上ASP.NET Core无授权Excel转PDF遇问题求助
解决Excel转HTML时的“Table not found”错误
我来帮你搞定这个问题!你遇到的ArgumentException: Table not found错误,核心原因是用错了OpenXML PowerTools的方法:
你当前调用的ConvertTableToHtml方法,是专门用来转换Excel里手动定义的表格对象(也就是你在Excel里通过「插入→表格」创建的结构化表格),而不是整个工作表(Worksheet)。你传入的"Sheet1"是工作表的名称,不是表格对象的名称,所以工具找不到对应的表格,自然报错。
正确的解决方案:转换整个工作表到HTML
你需要改用ConvertWorksheetToHtml方法,这个方法可以直接把整个工作表转换成HTML,不需要依赖工作表里的表格对象。下面是修改后的完整代码示例:
using OpenXmlPowerTools; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; // ... 你的其他代码逻辑 string htmlText = string.Empty; // 以只读模式打开文档(不需要修改的话,只读更安全高效) using (SpreadsheetDocument document = SpreadsheetDocument.Open(path, false)) { // 根据工作表名称获取对应的WorksheetPart WorksheetPart targetWorksheetPart = GetWorksheetPartByName(document, "Sheet1"); if (targetWorksheetPart == null) { throw new ArgumentException("指定的工作表不存在,请检查名称是否正确"); } // 配置转换设置(可以根据需求调整,比如是否包含样式、是否显示网格线等) var converterSettings = new SmlToHtmlConverterSettings(); // 转换整个工作表为HTML htmlText = SmlToHtmlConverter.ConvertWorksheetToHtml(targetWorksheetPart, converterSettings).ToString(); } // 辅助方法:通过工作表名称查找对应的WorksheetPart private static WorksheetPart GetWorksheetPartByName(SpreadsheetDocument doc, string sheetName) { foreach (Sheet sheet in doc.WorkbookPart.Workbook.Sheets) { if (string.Equals(sheet.Name, sheetName, StringComparison.OrdinalIgnoreCase)) { return doc.WorkbookPart.GetPartById(sheet.Id) as WorksheetPart; } } return null; }
额外注意事项
- 文档打开模式:把
Open方法的第二个参数改成false(只读模式),因为你只是读取转换,不需要修改文档,这样能避免不必要的文件锁问题。 - 工作表名称校验:添加了工作表存在性校验,避免因为工作表名称拼写错误导致的问题。
- 样式调整:转换后的HTML可能样式比较基础,你可以通过修改
SmlToHtmlConverterSettings或者后续给HTML添加自定义CSS,来优化表格的边框、字体、宽度等样式,方便后续转PDF时的格式还原。 - 后续转PDF:你之前计划的「HTML转PDF」路线是可行的,推荐使用免费的库比如DinkToPdf或者iTextSharp(注意版本授权),转换时记得引入HTML里的样式,确保PDF格式和HTML一致。
内容的提问来源于stack exchange,提问作者Samuel Leung
相关产品推荐
相关产品推荐

