当前位置: 首页 > 知识库问答 >
问题:

接收Excel文件中包含内容的问题消息

何松
2023-03-14

我目前正在用OpenXml手工构建一个Excel文件。我在添加床单的过程中,但是,我遇到了一个问题。我有一个循环,添加每个工作表的名称,但一旦它运行,我试图打开文件,我得到以下消息

“我们发现‘文件ame.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。链接。

更新:奇怪的是,有人认为这个问题是关于找到一些代码来帮助验证我在做什么。不是。。。问题很清楚:为什么我在尝试命名工作表时遇到错误。虽然我找到了一些验证代码,但我并没有要求验证代码。

如果你想帮忙,请阅读问题,而不是假设我在问什么,如果你不知道我想回答什么,请问。。。

共有2个答案

蓬长恨
2023-03-14

我已经解决了问题。问题是Name属性的最大长度为31个字符。我试图使用的文本有时会超过这个限制(一个有42个字符)。我还找到了一组非常酷的代码来验证我的Open Xml,以找出具体的问题。链接

翟弘
2023-03-14

为了找出导致此错误的问题,您需要验证生成的文档。

除了使用本文所述的内置验证方法(这并没有显示我发现的所有问题)之外,我建议您下载并安装Microsoft Office的Open XML SDK 2.5。

它包含Microsoft的Open XML SDK 2.5生产力工具,在这里非常有用:

>

  • 创建损坏的XLSX文件的副本,并按照Microsoft Excel的建议应用修复程序(假设您有文件FileName_corrupt.xlsxFileName_fixed.xlsx

    然后,运行微软的OpenXMLSDK2.5生产力工具,打开FileName\u corrupt。xlsx,选择“比较文件”并指定第二个文件名。xlsx。这允许您比较两个文件的XML结构。

    让微软的开放XML SDK 2.5生产力工具从两个文件中生成C#代码:首先打开它们,然后右键单击根级别并选择“反映代码”。这将创建C#代码,允许您生成相同的文件。保存两个C#代码版本(即:FileName_corrupt.cs和FileName_fixed.cs)

    现在您可以通过Visual Studio比较差异:使用
    devenv.exe /diffFileName_corrupt.csFileName_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);
        }
    }
    

    稍加修改,您也可以轻松使用上面的代码进行Microsoft Word验证:

    public static void ValidateWordDocument(string fileName)
    {
        using (var docx = WordprocessingDocument.Open(fileName, true))
        {
            ValidateOpenXmlDocument(docx);
        }
    }
    

  •  类似资料:
    • 问题内容: 我可以轻松删除子引用中的文件,但是如何从Firebase Storage中删除整个文件夹? 错误文件不存在。有任何想法吗? 问题答案: 长话短说,我们尚未实现递归(或文件夹)删除。 目前,我们建议将文件列表存储在另一个源(例如,实时数据库)中,并根据需要删除文件。您也可以在Firebase控制台(console.firebase.google.com)中执行这种删除。 将来,我们可能会

    • 我用python编写了代码,打开了一个模板excel文件。每天午夜,它都会将模板复制到一个新的excel文件中,代码会在其中记录当天的数据。我的目标是使用pyinstaller创建一个包含我的代码和模板excel文件的可执行文件。 基本上,我希望能够打开模板excel文件,不管计算机是否包含该文件,通过捆绑excel文件到从pyInster获得的exe文件: 现在我打开excel文件,如下所示:

    • 如何强制pyinstaller使用特定的。打包为exe时的jar文件? 我正在尝试生成一个使用tabla-py-lib的可执行文件。这个库需要一个jar文件tabla-1.0.1-jar-with-dependencies。jar,我的文件中有。py文件夹。这些是myfile中的一些修改。规格: 然而,错误仍然存在。当我从命令行运行我的代码时,函数read_pdf(),来自tabula-py,它使

    • 我试图在团队将websphere配置文件设置为活动状态时实现云配置文件也被激活。 yaml文件 当我设置时,我收到以下错误

    • 我只想有一个,将工作簿的内容写入应用程序中的文件中,并在此 excel 中创建多个工作表。我正在使用Apache POI来读取/写入我的excel。我有以下方法这样做 - 我在这里面临的问题是,每次我调用时,都会创建一个新文件,并且存量数据会被覆盖。我只想要一个文件,并且需要将新的工作表添加到我现有的文件中。我如何实现这一点?

    • 问题内容: 我有2个excel文件,我想比较内容并突出显示差异。例如: 第一个档案… 有没有第三方图书馆可以做到这一点?或最好的方法是什么? 问题答案: 就像DaDaDom所说的那样,Apache POI是您想要的。您可以从此页面下载它。请注意,POI项目不是完全独立的,您可能需要下载一些额外的库。请遵循Apache POI网站上的说明。这是您的用法: 如果这是一个新文件,则可能需要先创建图纸才能