问题:Excel在“xxx.xlsx”中发现不可读取的内容。是否恢复此工作薄的内容?【原创】

现象:

点"是(Y)"

提示信息中提到的error242440_02.xml文件:

 

问题重现:

package poi;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class FoundUnreadRecord {

    public static void main(String[] args) throws IOException {
        int rowNum = 1;
        createExcel_Reference(rowNum);
        createExcel_WithTips(rowNum);

        rowNum = 0;
        createExcel_Reference(rowNum);
        createExcel_WithTips(rowNum);
    }

    private static void createExcel_Reference(int rowNum) throws FileNotFoundException,
            IOException {
        String fileName = "UnreadRecordTips_Reference"+rowNum+".xlsx";

        XSSFWorkbook wb = new XSSFWorkbook();
        Sheet sheet = wb.createSheet("UnreadRecordTips");
        for (int i = 0; i <= rowNum; i++) {
            Row row = sheet.createRow(i);
            Cell cell = row.createCell(0);
            cell.setCellValue("test" + i);
        }

        write(fileName, wb);
    }

    private static void createExcel_WithTips(int rowNum) throws FileNotFoundException,
            IOException {
        String fileName = "UnreadRecordTips"+rowNum+".xlsx";;
        XSSFWorkbook wb = new XSSFWorkbook();
        Sheet sheet = wb.createSheet("UnreadRecordTips");
        for (int i = 0; i <= rowNum; i++) {
            Row row = sheet.createRow(i);
            Cell cell = row.createCell(0);
            cell.setCellValue("test" + i);
            sheet.addMergedRegion(new CellRangeAddress(0, rowNum, 0, 0));
        }
        write(fileName, wb);
    }

    private static void write(String fileName, XSSFWorkbook wb)
            throws FileNotFoundException, IOException {
        OutputStream stream = new FileOutputStream(fileName);
        wb.write(stream);
        stream.close();
    }
}

分析及原因:

 

org.apache.poi.xssf.usermodel.XSSFWorkbook下进行合并单元格操作,

org.apache.poi.ss.util.CellRangeAddress.CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)

中涉及的单元格,如果对其中任何一个单元格进行超过一次addMergedRegion操作,则生成的excel打开时,会出现以上提示。

TIPS:

(1)org.apache.poi.hssf.usermodel.HSSFWorkbook.HSSFWorkbook()无此问题。可能是因为XSSFWorkbook是基于OOXML(.xlsx) file format

(2)POI进行一次addMergedRegion操作,每Cell中值仍然可以读取,只是在Excel中没有显示

 

package poi;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class MergedRegionReadHiddenValue {

    private static final String sheetName="mergedRegion";

    public static void main(String[] args) throws IOException {
        Workbook wb;
        wb=new HSSFWorkbook();
        String fileName="mergedRegion.xls";
        createExcelWithMergedRegion(wb,fileName);
        InputStream s=new FileInputStream(fileName);
        wb=new HSSFWorkbook(s);
        travelSheet(wb, sheetName);
        s.close();

        System.out.println("xls End.=========================xlsx Begin");

        wb=new XSSFWorkbook();
        fileName="mergedRegion.xlsx";
        createExcelWithMergedRegion(wb,fileName);
        s=new FileInputStream(fileName);
        wb=new XSSFWorkbook(s);
        travelSheet(wb, sheetName);
        s.close();
    }

    private static void createExcelWithMergedRegion(Workbook wb,String fileName)
            throws FileNotFoundException, IOException {

        Sheet sheet=wb.createSheet(sheetName);
        int lastRowNum=2;
        for (int i=0;i<=lastRowNum;i++) {
            createRowFillValue(sheet,i);
        }
        sheet.addMergedRegion(new CellRangeAddress(0, lastRowNum, 0, 0));
        write(wb, fileName);
    }

    private static void travelSheet(Workbook wb, String sheetName) {
        Sheet sheet;
        sheet=wb.getSheet(sheetName);
        for (Row row : sheet) {
            System.out.println(row.getCell(0).getStringCellValue());
        }
    }

    private static void write(Workbook wb, String fileName)
            throws FileNotFoundException, IOException {
        OutputStream stream=new FileOutputStream(fileName);
        wb.write(stream);
        stream.close();
    }

    private static void createRowFillValue(Sheet sheet,int rowIdx) {
        Row row=sheet.createRow(rowIdx);
        Cell cell=row.createCell(0);
        cell.setCellValue("CellValue,"+rowIdx+",0");;
    }

}

OutPut:

CellValue,0,0
CellValue,1,0
CellValue,2,0
xls End.=========================xlsx Begin
CellValue,0,0
CellValue,1,0
CellValue,2,0

生成的Sheet内容示例:

 

时间: 2024-11-01 14:00:34

问题:Excel在“xxx.xlsx”中发现不可读取的内容。是否恢复此工作薄的内容?【原创】的相关文章

用Excel打开.xls文件提示“发现不可读取内容”如何解决

问题现象:打开Excel文件时,出现提示"Excel在xxx.xls中发现不可读取的内容",点击否的话,则不能打开文件,点击是的话则可以打开文件,但是文档却一片空白或者出现乱码,这该怎么解决呢?电脑爱好者为您分析. 出现这类问题,是office软件经常性的问题,不单单Excel文档会如此,Word文档也会如此:Word文档损坏解决办法. 出现这种问题,先不要着急,冷静分析. 在刚开始打开文档时弹出的提示对话框中,我们选择"是",则会弹出"修复框"

Excel工作薄与工作表的关系

刚学习Excel的网友,面对书籍上所讲的工作薄.工作表,难于理解这些概念! 下面,本文就给您详细介绍,Excel中的工作薄和工作表是啥关系,如何来理解工作薄与工作表的概念. 一.工作薄 首先我们看下图.注意看标题部分. "我的工作薄.xls",其扩展名为xls,指的是一个Excel文件.该Excel文件,指的就是一个工作薄. 简单的讲,一个Excel文件,也就是一个xls文件,指的就是一个工作薄. 二.工作表 现在,我们来看,如上图的Excel文件,里面存在Sheet1.Sheet2.

如何手动恢复未保存的Excel工作薄

在Excel2010中用户可以手动恢复未保存的工作簿,其方法主要有以下三种: 方法一.在"文件"选项卡中单击"信息"选项卡,在其界面左侧单击"管理版本"按钮,如图所示: 在弹出的下拉菜单中选择"恢复未保存的工作簿"命令,如图所示: 打开"打开"对话框,在中间的列表框中选择需要恢复的工作簿,单击"打开"按钮即可,如图所示: 方法二.在"文件"选项卡中单击"最近

C#如何获取Excel工作薄中Sheet页(工作表)名集合

#region 获取Excel工作薄中Sheet页(工作表)名集合 02./// <summary> 03./// 获取Excel工作薄中Sheet页(工作表)名集合 04./// </summary> 05./// <param name="excelFile">Excel文件名及路径,EG:C:\Users\JK\Desktop\导入测试.xls</param> 06./// <returns>Sheet页名称集合<

C# 获取Excel工作薄中Sheet页(工作表)名集合

#region 获取Excel工作薄中Sheet页(工作表)名集合 /// <summary> /// 获取Excel工作薄中Sheet页(工作表)名集合 /// </summary> /// <param name="excelFile">Excel文件名及路径,EG:C:\Users\JK\Desktop\导入测试.xls</param> /// <returns>Sheet页名称集合</returns> pr

poi读取1个excelA.xls,然后将excelA的数据赋值到excelB.xlsx中

问题描述 poi读取1个excelA.xls,然后将excelA的数据赋值到excelB.xlsx中要求能保存excelA.xls的格式.要求用poi下面附图,这个excel是excel2003版本的要求新生成的excel是2007的主要就是要保存这个格式.做到一模一样我自己写的读取数据只做到如下步骤 解决方案 解决方案二:小白来求助了.百度没找到相关信息应该是我的关键词不太对解决方案三:不能直接把Acopy一份B,然后再把B的文件名改成.xlsx么解决方案四:使用poi,读取合并单元格,只需要

asp.net 导出excel与单元格中图片的方法:

asp教程.net 导出excel与单元格中图片的方法: 在asp.net教程中导出excel有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上:一种是将文件直接将文件输出流写给浏览器.在response输出时,t分隔的数据,导出excel时,等价于分列,n等价于换行. 1.将整个html全部输出excel 此法将html中所有的内容,如按钮,表格,图片等全部输出到excel中.    response.clear();        response.buf

RSS的在线订阅服务:从订阅中发现社交网络

rss|网络|在线 今天看到:WebLeOn's Blog: Longhorn拥抱RSS,之前层出不穷的客户端RSS订阅工具要小心了,"缺省"威力目前还是很大的.相比之下我感觉在线的RSS订阅无疑会成为以后更有前景的模式.BlogLines就是目前人气较高的RSS在线订阅服务之一. 我使用BlogLines比较少,BlogLines缺省的按照作者分类的RSS阅读模式效率不高,还是更习惯根据时间倒排的新闻流水,所以一直尝试着使用Lilina每天生成一份RSS报纸.但除此之外:还是能感受到

Excel软件打开电脑中的csv文件显示乱码如何解决

  Excel软件打开电脑中的csv文件显示乱码如何解决           1.右击CSV文件,选择通过记事本方式打开; 2.打开后没有显示乱码,接着点击文件--另存为; 3.修改一下文件名,注意要保留csv格式,下方的编码选择UTF-8,点击保存; 4.完成后用Excel打开新保存的csv文件就不会显示乱码.