【问题标题】:Data validation error in Excel XML preventing generated sheets from opening only in Office 2010Excel XML 中的数据验证错误阻止生成的工作表仅在 Office 2010 中打开
【发布时间】:2014-05-10 04:18:04
【问题描述】:

底线:

为了让这些工作表像以前一样正常工作,我可以做哪些最简单的更改? (整个系统将在另外 8 到 10 个月后退役,它不一定是最漂亮的修复)


背景:

我们有一个...较旧的...程序生成一堆 Excel XML/HTML 电子表格。这些工作表是带有“.xls”扩展名的纯文本 XML/HTML。是的,我们得到了数据格式消息,需要使用它的人可以继续使用该消息。

自从我们将 Office 2000 作为公司标准(并且最初是针对 Excel 2000 支持的内容编写)以来,它就一直在运行;并继续使用,只需稍作调整即可通过升级到 Office 2003 和 Office 2007 继续运行。

现在我们的 IT 部门1 开始推出 Office 2010 作为 Windows 7 更加锁定的映像的一部分,而这些人在生成的工作表上遇到了问题。需要明确的是:仍在使用 Office 2007 的每个人都可以正常使用工作表 - 只有 Office 2010。

问题似乎与数据验证部分有关。

  • 完全删除它是可行的(尽管我们最终会得到导致我们首先添加它的垃圾数据)。
  • 稍作修改会消除阻塞错误(工作表打开),但不存在验证。
  • 根据我在网上找到的内容进行的其他编辑最终会导致错误或导致第二个项目符号...

应该发生的是,每个单元格都应该显示一个下拉列表,其中包含由同一工作表上的另一列填充的日期列表。


代码:

所有工作表都以 Office 2000 样式开始:

<html xmlns:x="urn:schemas-microsoft-com:office:excel">
<head>
<style>
<!--table
@page
{mso-header-data:"&CRegistrationList\000APrinted\: &D\000APage &P";}
br
{mso-data-placement:same-cell;}
-->
td {border:1px solid black; border-collapse:collapse;}
td.EvenRow {background:#F5F5F5; color:black;}
td.OddRow {background:#DCDCDC; color:black;}

为了简洁,删掉几行...

</style>
<!--[if gte mso 9]><xml>
<x:ExcelWorkbook>
<x:ExcelWorksheets>
<x:ExcelWorksheet>
<x:Name>RegistrationList</x:Name>

剪掉更多内容以找到实际导致错误的部分:(有一些额外的上下文,cmets 不在原版中)

</x:WorksheetOptions>
<x:DataValidation>
<x:Range>G:G</x:Range>
<x:Type>List</x:Type>
<x:Value>$K$2:$K$34</x:Value>
<x:InputMessage>Select Date from list</x:InputMessage>
<x:ErrorMessage>You must select a date from the list. Press 'Cancel' to continue.</x:ErrorMessage>
</x:DataValidation>
</x:ExcelWorksheet>
</x:ExcelWorksheets>
</x:ExcelWorkbook>
</xml><![endif]-->
</head>
<body>
<table>
<tr>
<th style="mso-protection:locked visible; width:95px;">EmployeeNumber</th> <!-- Col. A -->
<th style="mso-protection:locked visible; width:120px;">LastName</th> <!-- Col. B -->
<th style="mso-protection:locked visible; width:120px;">FirstName</th> <!-- Col. C -->
<th style="mso-protection:locked visible; width:80px;">AccountingCode</th> <!-- Col. D -->
<th style="mso-protection:locked visible; width:90px;">ClinicalCreds</th> <!-- Col. E -->
<th style="mso-protection:locked visible; width:0px;">Extension</th> <!-- Col. F -->
<th style="mso-protection:locked visible; width:170px;">DateToRegister</th> <!-- Col. G -->
<th style="mso-protection:locked visible; width:170px;">Notes</th> <!-- Col. H -->
<th style="mso-protection:locked visible; width:170px;">CPRExpDate</th> <!-- Col. I -->
<th style="mso-protection:locked visible; width:200px;">AdminNotice</th> <!-- Col. J -->
<th style="mso-protection:locked; width:0px;">DataValidation</th> <!-- Col. K -->
</tr>

从那里我们继续使用包含电子表格数据的常规 HTML 表格。

我在这里找到了看起来很接近的one other question,并尝试了那里的各种代码排列,但没有成功。

<x:dataValidations count="1">
    <x:dataValidation type="list" showInputMessage="1" showErrorMessage="1" sqref="G:G">
        <x:formula1>$K$2:$K$34</x:formula1>
    </x:dataValidation>
</x:dataValidations>

添加&lt;x:DataValidations count="1"&gt; 包装器(如下所示)消除了阻止工作表打开的错误消息,但无法在 Office 2010 中启用数据验证(我仍在尝试使用 VM 或其他东西以确保这不会破坏那些使用 Office 2007 的)。

<x:DataValidations count="1">
<x:DataValidation>
<x:Range>G:G</x:Range>
<x:Type>List</x:Type>
<x:Value>$K$2:$K$34</x:Value>
<x:InputMessage>Select Date from list</x:InputMessage>
<x:ErrorMessage>You must select a date from the list. Press 'Cancel' to continue.</x:ErrorMessage>
</x:DataValidation>
</x:DataValidations>


总结:

这让我们回到了最初的问题:为了让这些工作表像以前一样工作,我可以做哪些最简单的更改? (整个系统将在另外 8 到 10 个月后退役,它不一定是最漂亮的修复)

总是有其他选择(复制/粘贴模板并通过 Jet ODBC 将数据填充到其中),但由于在不久的将来会消失,这类事情需要大量工作。


1 我很高兴成为一名不在我们 IT 部门工作的程序员 - 它有其优点和缺点。我之所以提到只是因为一些建议选项可能超出了我的修复范围,但如果有足够的证据,我可能可以说服 IT 做出改变。

【问题讨论】:

  • 您是否尝试过 Office2010 的以下修补程序? support.microsoft.com/kb/2553436?我没有安装Office2010。所以我不能自己测试修复。
  • @Hans - 我没有机会尝试。 [插入苦笑] 在新的设置中,我没有足够的权限来安装任何东西,而且由于最近的大雨,IT 部门被淹没在他们的办公室,他们现在有点心事重重。 ..

标签: excel ms-office openxml validation


【解决方案1】:

将其保留为占位符 - 由于工作压力,如果在周二早上上班时没有工作选项,我将不得不编写一个新程序:

  1. 复制并重命名“template.xlsx”
    (该文件将包含所有适当的数据验证、条件格式等)
  2. 通过 JET/ADODB 将数据添加到空白文件中
  3. 冲洗,重复直到创建所有床单

它会将其他所有事情推迟一天,但我只是没有时间可用:(

【讨论】:

    【解决方案2】:

    尝试用 R1C1 表示法定义范围。我在 Excel 2013 上,并将带有数据验证的文件保存为 XML 电子表格(2003 版本,因此它可能没有相同的语法)。以下是单元格 C3 上的数据验证示例,可接受的值定义为 E3:E5:

      <DataValidation xmlns="urn:schemas-microsoft-com:office:excel">
       <Range>R3C3</Range>
       <Type>List</Type>
       <Value>R3C5:R5C5</Value>
      </DataValidation>
    

    就像我说的,我会坚持使用您一直使用的语法,但尝试将 A1 单元格符号替换为 R1C1。

    【讨论】:

    • 没有骰子 - 没有验证错误,但也没有发生实际验证。
    • 你试过用 $G$1:$G$65536 代替 G:G 吗? (2 ^ 16 行,因为我假设数据格式不能处理超过那么多行。如果工作簿由于在 2007 年以上打开而可以包含更多行,我会将其更改为 1048576)。
    • 是的,也试过了。根据我在 MSDN 上找到的所有内容,“G:G”是引用整个专栏的正确方法。为了彻底,我也尝试了“$G:$G”和“G1:G10246”(不是实数,有一个可以覆盖最大值——我只是没有在我的 ATM 前面),以及几乎所有其他排列。我还尝试以各种不同的方式明确引用工作表(例如“RegistrationList”!G:G)。
    • 我想至少奖励我的努力。感谢您的尝试。
    • 这是一条我不知道的途径——学习新东西几乎总是有帮助的。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 2013-03-17
    相关资源
    最近更新 更多