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)
解决办法:
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
原创粉丝点击