现象:

点"是(Y)"

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

问题重现:

  1. package poi;
  2.  
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.OutputStream;
  7.  
  8. import org.apache.poi.ss.usermodel.Cell;
  9. import org.apache.poi.ss.usermodel.Row;
  10. import org.apache.poi.ss.usermodel.Sheet;
  11. import org.apache.poi.ss.util.CellRangeAddress;
  12. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  13.  
  14. public class FoundUnreadRecord {
  15.  
  16. public static void main(String[] args) throws IOException {
  17. int rowNum = 1;
  18. createExcel_Reference(rowNum);
  19. createExcel_WithTips(rowNum);
  20.  
  21. rowNum = 0;
  22. createExcel_Reference(rowNum);
  23. createExcel_WithTips(rowNum);
  24. }
  25.  
  26. private static void createExcel_Reference(int rowNum) throws FileNotFoundException,
  27. IOException {
  28. String fileName = "UnreadRecordTips_Reference"+rowNum+".xlsx";
  29.  
  30. XSSFWorkbook wb = new XSSFWorkbook();
  31. Sheet sheet = wb.createSheet("UnreadRecordTips");
  32. for (int i = 0; i <= rowNum; i++) {
  33. Row row = sheet.createRow(i);
  34. Cell cell = row.createCell(0);
  35. cell.setCellValue("test" + i);
  36. }
  37.  
  38. write(fileName, wb);
  39. }
  40.  
  41. private static void createExcel_WithTips(int rowNum) throws FileNotFoundException,
  42. IOException {
  43. String fileName = "UnreadRecordTips"+rowNum+".xlsx";;
  44. XSSFWorkbook wb = new XSSFWorkbook();
  45. Sheet sheet = wb.createSheet("UnreadRecordTips");
  46. for (int i = 0; i <= rowNum; i++) {
  47. Row row = sheet.createRow(i);
  48. Cell cell = row.createCell(0);
  49. cell.setCellValue("test" + i);
  50. sheet.addMergedRegion(new CellRangeAddress(0, rowNum, 0, 0));
  51. }
  52. write(fileName, wb);
  53. }
  54.  
  55. private static void write(String fileName, XSSFWorkbook wb)
  56. throws FileNotFoundException, IOException {
  57. OutputStream stream = new FileOutputStream(fileName);
  58. wb.write(stream);
  59. stream.close();
  60. }
  61. }
分析及原因:
 
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中没有显示
  1. package poi;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.OutputStream;
  9.  
  10. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  11. import org.apache.poi.ss.usermodel.Cell;
  12. import org.apache.poi.ss.usermodel.Row;
  13. import org.apache.poi.ss.usermodel.Sheet;
  14. import org.apache.poi.ss.usermodel.Workbook;
  15. import org.apache.poi.ss.util.CellRangeAddress;
  16. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  17.  
  18. public class MergedRegionReadHiddenValue {
  19.  
  20. private static final String sheetName="mergedRegion";
  21.  
  22. public static void main(String[] args) throws IOException {
  23. Workbook wb;
  24. wb=new HSSFWorkbook();
  25. String fileName="mergedRegion.xls";
  26. createExcelWithMergedRegion(wb,fileName);
  27. InputStream s=new FileInputStream(fileName);
  28. wb=new HSSFWorkbook(s);
  29. travelSheet(wb, sheetName);
  30. s.close();
  31.  
  32. System.out.println("xls End.=========================xlsx Begin");
  33.  
  34. wb=new XSSFWorkbook();
  35. fileName="mergedRegion.xlsx";
  36. createExcelWithMergedRegion(wb,fileName);
  37. s=new FileInputStream(fileName);
  38. wb=new XSSFWorkbook(s);
  39. travelSheet(wb, sheetName);
  40. s.close();
  41. }
  42.  
  43. private static void createExcelWithMergedRegion(Workbook wb,String fileName)
  44. throws FileNotFoundException, IOException {
  45.  
  46. Sheet sheet=wb.createSheet(sheetName);
  47. int lastRowNum=2;
  48. for (int i=0;i<=lastRowNum;i++) {
  49. createRowFillValue(sheet,i);
  50. }
  51. sheet.addMergedRegion(new CellRangeAddress(0, lastRowNum, 0, 0));
  52. write(wb, fileName);
  53. }
  54.  
  55. private static void travelSheet(Workbook wb, String sheetName) {
  56. Sheet sheet;
  57. sheet=wb.getSheet(sheetName);
  58. for (Row row : sheet) {
  59. System.out.println(row.getCell(0).getStringCellValue());
  60. }
  61. }
  62.  
  63. private static void write(Workbook wb, String fileName)
  64. throws FileNotFoundException, IOException {
  65. OutputStream stream=new FileOutputStream(fileName);
  66. wb.write(stream);
  67. stream.close();
  68. }
  69.  
  70. private static void createRowFillValue(Sheet sheet,int rowIdx) {
  71. Row row=sheet.createRow(rowIdx);
  72. Cell cell=row.createCell(0);
  73. cell.setCellValue("CellValue,"+rowIdx+",0");;
  74. }
  75.  
  76. }

OutPut:

  1. CellValue,0,0
  2. CellValue,1,0
  3. CellValue,2,0
  4. xls End.=========================xlsx Begin
  5. CellValue,0,0
  6. CellValue,1,0
  7. CellValue,2,0

生成的Sheet内容示例:

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

  1. NPOI “发现 中的部分内容有问题,是否要恢复此工作薄的内容?如果信任此工作薄的来源。。。”的问题的解决方法

    网上说的方法是调整Sheet可见和顺序:https://blog.csdn.net/hulihui/article/details/21196951 stackoverflow给出的解释是:单元格存储 ...

  2. Excel催化剂开源第10波-VSTO开发之用户配置数据与工作薄文件一同存储

    在传统的VBA开发中,若是用的是普通加载项方法,是可以存储数据在xlam上的,若用的是Com加载项方法同时是Addins程序级别的项目开发的,配置文件没法保存到工作薄中,一般另外用配置文件来存放供调用 ...

  3. Excel VBA入门(九)操作工作薄

    虽然我前面讲过,在VBA中操作工作薄并不是件明智的事,但有些时候,还是避免不了要这么做.绝大多数情况下,我们要做的是获取到某个工作薄对象,并以此来获得其中的工作表对象,然后再对工作表中的数据进行处理. ...

  4. Excel无法打开文件xxx.xlsx,因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配

    office版本:2016 系统版本:win10 问题描述: 1.桌面新建excel表格后,打开时,提示“Excel无法打开文件xxx.xlsx,因为文件格式或文件扩展名无效.请确定文件未损坏,并且文 ...

  5. POI导出Excel发现不可读取的内容

    环境说明:MyEclipse Tomcat7.0 通过后台查询数据,导出Excel在打开时会出现以下提示: 点击否,则不显示任何内容,点击是,弹出 查看修改记录为: 通过WPS打开不会出现任何提示,可 ...

  6. POI导出Excel(xls、xlsx均可以,也支持图片)——(三)

    Jar包

  7. DataTable to Excel(使用NPOI、EPPlus将数据表中的数据读取到excel格式内存中)

    /// <summary> /// DataTable to Excel(将数据表中的数据读取到excel格式内存中) /// </summary> /// <param ...

  8. 为Secure Store Service生成新密钥,解决“生成密钥过程中发现错误”的问题

    我们集成TFS和SharePoint Server以后,一个最常见的需求是通过SharePoint Server的Excel Service读取TFS报表中的信息,利用Excel Service的强大 ...

  9. C#读取Excel显示到repeater中

    首先需要一个用来存储我们需要显示的内容,防止页面回发丢失(添加时使用) #region 缓存文件 private DataTable excelData; /// <summary> // ...

随机推荐

  1. 在不连接网线的情况下Windos与VM之间如何ping通

    一般情况下,如果宿主主机的网口连接网线并且能够上网,那么按照VM的默认安装,在VM-Settings-Hardware-Network Adapter-Network connection中选择Bri ...

  2. 字符设备驱动4: ioremap

    #define GPIO_OFT(x) ((x) - 0x56000000)#define GPFCON (*(volatile unsigned long *)(gpio_va + GPIO_OFT ...

  3. Oracle AWR 报告详解

    转自:http://blog.csdn.net/laoshangxyc/article/details/8615187 持续更新中... Oracle awr报告详解 DB Name DB Id In ...

  4. Java NIO--初步认识

    : 一.java NIO 和阻塞I/O的区别      1. 阻塞I/O通信模型      2. java NIO原理及通信模型 二.java NIO服务端和客户端代码实现 一.java NIO 和阻 ...

  5. 【转】OpenCV中使用神经网络 CvANN_MLP

    原文见:http://blog.csdn.net/xiaowei_cqu/article/details/9027617 OpenCV的ml模块实现了人工神经网络(Artificial Neural ...

  6. Struts2、spring2、hibernate3在SSH中各起什么作用

    简单的说: struts 控制用的 hibernate 操作数据库的 spring用解耦的 详细的说: STRUTS 在 SSH 框架中起控制的作用 , 其核心是 Controller, 即 Acti ...

  7. 动态加载EXE和DLL

    程序中加载了一个DLL文件,但生成的EXE在脱离了DLL文件后仍然可以 单独使用,这是动态加载DLL技术.即:调用资源中的DLL. 此技术的好处:EXE可以使用DLL中的函数,但不会额外增加一 个DL ...

  8. Impossible WPF Part 1: Binding Properties

    原文 http://www.11011.net/wpf-binding-properties Ever wanted to write the following? <RichTextBoxDo ...

  9. 说服式设计(persuasive design)的行为模型

    转自:http://www.sharetk.com/html/ued/User-Research/1404.html 一 模型简介 BJ Fogg提出了一个新的理解人类行为的模型,他称之为Fogg b ...

  10. 基于visual Studio2013解决C语言竞赛题之0522和为素

     题目