excel2007格式文件错误的修复
来源:互联网 发布:房产数据哪个好 编辑:程序博客网 时间:2024/05/19 23:04
一个excel突然打不开了,提示错误为:
Replaced Part: /xl/worksheets/sheet3.xml part with XML error. 灾难性故障 Line 2, column 82450988.
Removed Records: Formula from /xl/calcChain.xml part (Calculation properties)
Removed Records: Formula from /xl/calcChain.xml part (Calculation properties)
解决办法:
1、修改文件后缀名".xlxs"为".zip",解压,根据错误找到sheet3.xml文件
2、尝试使用浏览器打开(想让浏览器检测告诉我文件错误位置),但因为文件过大(80多M),根本打不开
3、写个程序A读取错误位置(java),代码如下:
</pre><pre name="code" class="java">import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileOutputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;public class XlsxReader { public static void main(String[] args) throws Exception { new XlsxReader().readxml(); } public void readxml() throws Exception { InputStream input = ClassLoader.getSystemResourceAsStream( "sheet3.xml" ); BufferedReader reader = new BufferedReader( new InputStreamReader(input)); reader.readLine(); char [] cs = new char[1000]; int cnt = -1, total = 0; while ((cnt = reader.read(cs, 0, cs. length )) != -1) { total += cnt; // 第一次提示报错位置为第二行第82450988列 if (total > 82450000 & total < 82451000 ) { System. out .println( new String(cs, 0, cnt)); } } }}
4、把打印出来的内容分析了一下,没有发现什么错误,可见office提示的错误不准确,再写个程序B检测一下语法(java),代码如下:
import java.io.InputStream;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.helpers.DefaultHandler;public class TestDemo { public static void main(String[] args) throws Exception { SAXParserFactory factory = SAXParserFactory. newInstance(); SAXParser parser = factory.newSAXParser(); InputStream input = ClassLoader.getSystemResourceAsStream( "sheet3.xml" ); parser.parse(input, new DefaultHandler()); }}
5、运行程序,提示错误:
lineNumber: 2; columnNumber: 82474524; 元素类型 "row" 必须后跟属性规范 ">" 或 "/>"。
可见错误实际是在82474524列,于是修改程序A,打印位置修改为
if (total > 82474000 & total < 82475000 ) { System. out .println( new String(cs, 0, cnt)); }
再运行程序,得到的输出为:
" s="50"/></row><row r="970903" spans="13:13" ht="13.5" thickBot="1"><c r="M970903" s="50"/></row><row r="970904" spans="13:13" ht="13.5" thickBot="1"><c r="M970904" s="50"/></row><row r="970905" spans="13:13" ht="13.5" thickBot="1"><c r="M970905" s="50"/></row><row r="970906" spans="13:13" ht="13.5" thickBot="1"><c r="M970906" s="50"/></row><row r="970907" spans="13:13" ht="13.5" thickBot="1"><c r="M970907" s="50"/></row><row r="970908" spans="13:13" ht="13.5" thickBot="1"><c r="M970908" s="50"/></row><row r="9708r="970760" spans="13:13" ht="13.5" thickBot="1"><c w r="970891" spans="13可见最后一个row明显错误,且进一步发现,82474000列已经到文件的结尾处了,那么,应该就是文件结尾处数据发生了丢失。于是,拿到一个正常的sheet的xml文件,取出结尾部分的代码,如:
</sheetData><phoneticPr fontId="7" type="noConversion" /><pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3" /><pageSetup paperSize="9" orientation="portrait" verticalDpi="0" r:id="rId1" /></worksheet>可见,再加上之前的输出内容的头部
" s = "50"/></ row >
形成最后需要替换的内容:
" s= "50" /></ row></ sheetData ><phoneticPr fontId= "7" type= "noConversion" />< pageMarginsleft = "0.7" right = "0.7" top = "0.75" bottom = "0.75" header = "0.3" footer = "0.3" />< pageSetup paperSize = "9" orientation = "portrait" verticalDpi = "0" r:id = "rId1" /></ worksheet >
6、编写程序C(java),代码如下:
import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileOutputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;public class XlsxWirter { public static void main(String[] args) throws Exception { new XlsxWirter().writexml(); } public void writexml() throws Exception { InputStream input = ClassLoader.getSystemResourceAsStream( "sheet3.xml" ); BufferedReader reader = new BufferedReader( new InputStreamReader(input)); FileOutputStream out = new FileOutputStream("sheet3-copy.xml" ); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(out)); writer.write(reader.readLine()); char [] cs = new char[1000]; int cnt = -1, total = 0; while ((cnt = reader.read(cs, 0, cs.length )) != -1) { total += cnt; // lineNumber: 2; columnNumber: 82474524; 元素类型 "row" 必须后跟属性规范 ">" 或 "/>"。 if (total > 82474000) { System. out .print( new String(cs, 0, cnt)); writer.write( "\" s=\"50\"/></row></sheetData><phoneticPr fontId=\"7\" type=\"noConversion\" /><pageMargins left=\"0.7\" right=\"0.7\" top=\"0.75\" bottom=\"0.75\" header=\"0.3\" footer=\"0.3\" /><pageSetup paperSize=\"9\" orientation=\"portrait\" verticalDpi=\"0\" r:id=\"rId1\" /></worksheet>"); } else { writer.write(cs, 0, cnt); } } writer.close(); } }
7、运行程序,生成新的文件sheet3-copy.xml,再使用程序B检查新的文件是否有语法错误,发现没有了,将sheet3-copy.xml重命名为sheet3.xml。然后用解压软件打开原始的错误excel文件(先打开解压文件程序,从程序中选择excel文件),找到sheet3.xml所在位置,将新的sheet3.xml文件拖入到解压程序的目录中,完成替换操作。
8、重新打开excel文件,文件内容重新回来了,呵呵
0 0
- excel2007格式文件错误的修复
- NPOI 1.2.4 是否可以读取 excel2007的xlsx格式文件
- NPOI导出Excel2007-xlsx格式文件,用于web时需要注意的问题-XSSFWorkbook处理问题
- MediaPlayer的错误修复
- 几个错误的修复
- excel2007:外表格式错误
- Java 将Excel2003(xls)/Excel2007(xlsx)转为Htm格式文件
- 修复solr的OutOfMemoryError错误
- 破解EXCEL2007的密码
- 破解EXCEL2007的密码
- excel2007的读取
- win7 启动修复(windows错误修复) 关闭的方法
- excel2007
- POI操作Excel2007的时 org.apache.xmlbeans.xmlexception 错误的解决方法
- 导入Excel2007/2010出现“找不到可安装的 ISAM”错误的原因
- 导入EXCEL2007报错"外部表不是预期的格式错误"的解决方法
- 导入EXCEL2007报错"外部表不是预期的格式错误"的解决方法
- 修复错误的word文档的新方法
- ASP类似新闻滚动效果的示例
- windows应用 便捷天气 隐私策略
- poj1659 Frogs' Neighborhood
- 数据挖掘的三大趋势
- 向量点乘与叉乘
- excel2007格式文件错误的修复
- java Pattern类中关于匹配group和group(int group)的一些学习
- android 4.4版本隐藏titleBar
- 算法导论第十四章数据结构的扩张
- 未对父类对象指定具体类型导致的找不到具体表异常
- Apache MINA网络通信框架
- 刚刚下单买了《Ruby元编程》,读到一篇此书点评
- GDB 打印设置
- 指定联合身份验证服务(AD FS)名称