Excel XML中的数据验证错误,导致生成的工作表仅在Office 2010中打开

时间:2014-05-05 18:06:19

标签: excel ms-office openxml validation

底线:

我可以做出哪些最简单的更改来保持这些工作表的正常运行? (整个系统在另外8到10个月内退役,它不一定是最漂亮的修复)

<小时/> 的背景

我们有一个...更老...程序生成一堆Excel XML / HTML电子表格。这些表格是纯文本XML / HTML,带有&#39; .xls&#39;延期。是的,我们得到了数据格式消息,需要使用它的人可以继续使用该消息。

由于我们将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>

进一步切换到实际导致错误的部分:(有一些额外的上下文,评论不在原文中)

</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>

添加<x:DataValidations count="1">包装器(如下所示)可以删除阻止工作表打开的错误消息,但不会在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改变。

2 个答案:

答案 0 :(得分:1)

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

  1. 复制并重命名“template.xlsx”
    (该文件将包含所有相应的数据验证,条件格式等)。
  2. 通过JET / ADODB
  3. 将数据添加到空白文件中
  4. 冲洗,重复,直到创建完所有纸张
  5. 它会把一切推回去,但我没有时间可用:(

答案 1 :(得分:0)

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

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

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