正在接收Excel文件中内容有问题的消息
本文关键字:有问题 消息 文件 Excel | 更新日期: 2023-09-27 18:22:38
我目前正在使用OpenXml手工构建一个Excel文件。我正在添加表单,但是,我遇到了一个问题。我有一个循环,它会添加每个工作表的名称,但一旦它运行并尝试打开文件,我就会收到以下消息:
我们发现"FileName.xlsx"中的某些内容有问题。是否希望我们尽可能多地恢复?如果您信任此工作簿的来源,请单击"是"。
我认为这个问题可能是由于我使用字符串变量添加到每张工作表的名称中。当我把它拿出来添加其他东西时,它就起作用了。下面是我的代码,我在其中循环并添加我的工作表。
//Technology Areas
foreach (DataRow dr in techAreaDS.Rows)
{
var data = dr["TechAreaName"].ToString().Split('-');
var techArea = data[2].TrimStart();
var techAreaSheet = new Sheet { Id = workbookPart.GetIdOfPart(worksheetPart),
SheetId = sheetId, Name = techArea };
sheets.Append(techAreaSheet);
sheetId++;
}
我看到有人提到,单元格中有可以转换为字符串的字符串,这是一个问题,但在这种情况下,字符串将始终是字符串。如有任何帮助,我们将不胜感激。
编辑:我已经解决了问题。问题是Name属性的最大长度为31。我的一个项目有42的长度,因此出现了错误。我确实找到了一组很酷的代码来验证我的OpenXml。链接
更新:奇怪的是,有人认为这个问题是关于找到一些代码来帮助验证我所做的事情。不是。。。问题很清楚:为什么我在命名表格时收到错误。我没有要求验证代码,尽管我找到了一些。
我确实要求,如果你想帮忙,请阅读问题,而不是假设我在问什么,如果你不知道我想回答什么,请问。。。
为了找出导致此错误的问题,您需要验证生成的文档。
除了使用这里描述的内置验证方法(它并没有像我发现的那样向您显示所有问题)之外,我建议您下载并安装Microsoft Office的Open XML SDK 2.5。
它包含Microsoft的Open XML SDK 2.5生产力工具,在这里非常有用:
-
创建损坏的XLSX文件的副本,并按照Microsoft Excel的建议应用修复程序(假设您有文件
FileName_corrupt.xlsx
和FileName_fixed.xlsx
-
然后,运行Microsoft的Open XML SDK 2.5 Productivity Tool,打开
FileName_corrupt.xlsx
,选择"比较文件";并指定第二文件CCD_ 4。这允许您比较两个文件的XML结构。 -
让Microsoft的Open XML SDK 2.5 Productivity Tool从这两个文件生成C#代码:首先打开它们,然后右键单击根级别并选择"反射代码";。这将创建C#代码,允许您生成相同的文件。保存两个C#代码版本(即FileName_corrup.cs和FileName_fixed.cs)
-
现在,您可以通过Visual Studio比较差异:使用
devenv.exe /diff FileName_corrupt.cs FileName_fixed.cs
比较它们,或者使用我创建的批处理文件来启动VS比较-这是Visual Studio中的一个隐藏功能,它允许比较两个不属于TFS的本地文件。
通过这种方式,您应该能够找出差异,并允许您修复代码。
注意:对于第一次验证,我建议使用验证代码。只有当它仍然失败时,才使用上面的步骤。为了验证,您可以使用
public static string ValidateOpenXmlDocument(OpenXmlPackage pXmlDoc, bool throwExceptionOnValidationFail=false)
{
using (var docToValidate = pXmlDoc)
{
var validator = new DocumentFormat.OpenXml.Validation.OpenXmlValidator();
var validationErrors = validator.Validate(docToValidate).ToList();
var errors = new System.Text.StringBuilder();
if (validationErrors.Any())
{
var errorMessage = string.Format("ValidateOpenXmlDocument: {0} validation error(s) with document", validationErrors.Count);
errors.AppendLine(errorMessage);
errors.AppendLine();
}
foreach (var error in validationErrors)
{
errors.AppendLine("Description: " + error.Description);
errors.AppendLine("ErrorType: " + error.ErrorType);
errors.AppendLine("Node: " + error.Node);
errors.AppendLine("Path: " + error.Path.XPath);
errors.AppendLine("Part: " + error.Part.Uri);
if (error.RelatedNode != null)
{
errors.AppendLine("Related Node: " + error.RelatedNode);
errors.AppendLine("Related Node Inner Text: " + error.RelatedNode.InnerText);
}
errors.AppendLine();
errors.AppendLine("==============================");
errors.AppendLine();
}
if (validationErrors.Any() && throwExceptionOnValidationFail)
{
throw new Exception(errors.ToString());
}
if (errors.Length > 0)
{
System.Diagnostics.Debug.WriteLine(errors.ToString());
}
return errors.ToString();
}
连同
public static void ValidateExcelDocument(string fileName)
{
using (var xlsx = SpreadsheetDocument.Open(fileName, true))
{
ValidateOpenXmlDocument(xlsx);
}
}
只需稍作修改,您就可以很容易地将上面的代码用于MicrosoftWord验证:
public static void ValidateWordDocument(string fileName)
{
using (var docx = WordprocessingDocument.Open(fileName, true))
{
ValidateOpenXmlDocument(docx);
}
}
我已经解决了这个问题。问题是Name属性的最大长度为31个字符。我尝试使用的文本有时会超过这个限制(一个文本有42个字符)。我还找到了一组非常酷的代码来验证我的Open Xml,以找出具体的问题