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

简介: 现象: 点"是(Y)" 提示信息中提到的error242440_02.xml文件:   问题重现: package poi; import java.io.FileNotFoundException; import java.

现象:

点"是(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内容示例:

 

目录
打赏
0
0
0
0
95
分享
相关文章
|
9月前
|
【unity小技巧】unity读excel配置表操作,excel转txt文本,并读取txt文本内容,实例说明
【unity小技巧】unity读excel配置表操作,excel转txt文本,并读取txt文本内容,实例说明
335 0
|
10月前
|
C#
C# 创建Excel并写入内容
C# 创建Excel并写入内容
605 0
Python办公自动化【Word转换PDF、PDF读取内容、PDF合并文件、PDF拆分文件、PDF加密文件、PPT基本操作-增加幻灯片、增加内容】(六)-全面详解(学习总结---从入门到深化)
Python办公自动化【Word转换PDF、PDF读取内容、PDF合并文件、PDF拆分文件、PDF加密文件、PPT基本操作-增加幻灯片、增加内容】(六)-全面详解(学习总结---从入门到深化)
180 0
Python办公自动化【Word转换PDF、PDF读取内容、PDF合并文件、PDF拆分文件、PDF加密文件、PPT基本操作-增加幻灯片、增加内容】(六)-全面详解(学习总结---从入门到深化)(下)
Python办公自动化【Word转换PDF、PDF读取内容、PDF合并文件、PDF拆分文件、PDF加密文件、PPT基本操作-增加幻灯片、增加内容】(六)-全面详解(学习总结---从入门到深化)
108 1
Python办公自动化【Word转换PDF、PDF读取内容、PDF合并文件、PDF拆分文件、PDF加密文件、PPT基本操作-增加幻灯片、增加内容】(六)-全面详解(学习总结---从入门到深化)(上)
Python办公自动化【Word转换PDF、PDF读取内容、PDF合并文件、PDF拆分文件、PDF加密文件、PPT基本操作-增加幻灯片、增加内容】(六)-全面详解(学习总结---从入门到深化)
154 0
程序设计之——手把手教你如何从Excel文件中读取学生信息
在当今信息化时代,计算机技术已经深入到各个领域,而程序设计则成为推动信息化建设的关键技术之一。在众多领域中,学生信息管理系统无疑是其中一个重要的应用。本文将从学生信息管理系统的开发入手,探讨开如何高效且保证质量的完成开发。
成信大ENVI_IDL第二周课堂内容:打开HDF4文件并读取文件以及简单的数据处理和保存+详细解析
成信大ENVI_IDL第二周课堂内容:打开HDF4文件并读取文件以及简单的数据处理和保存+详细解析
460 1
「趣学前端」实现读取excel文件内容小功能
用技术实现梦想,用梦想打开前端技术之门。分享一下读取excel文件内容小功能是如何实现的。
433 1
「趣学前端」实现读取excel文件内容小功能
【Excel自动化办公Part1】:处理Excel文件的相关模块介绍、打开和读取表格内容
【Excel自动化办公Part1】:处理Excel文件的相关模块介绍、打开和读取表格内容
151 0
【Excel自动化办公Part1】:处理Excel文件的相关模块介绍、打开和读取表格内容
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等