excel2007格式文件错误的修复

当遇到Excel2007文件打开提示XML错误时,可以通过更改文件后缀为.zip,解压找到错误的sheet3.xml。利用Java程序定位并修复XML错误,通过分析和对比正常文件的结尾部分,替换损坏的XML内容,最终成功修复Excel文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个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文件,文件内容重新回来了,呵呵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值