现在有excel1,excel2,excelall表格, 把excel1中a2的值和excel2中a2的值累加,然后放到excelall的a2中,需要动态获取数据,怎么做,请给思路
测试用excel,如图可见有两个一样的图片,但是其实是复制的两个不同文件:
poi获取图片我所知道的只有一个方法,为了测试我输出图片到了本地:
打印出的结果:
明明excel中有三张图片,却只打印了两张,输出到本地的图片也确实是去过重的两张。无论是改文件名还是怎么样,那两张图片永远都被视为一张。
不死心的我又拿到了他单元格的数据,单元格类型为FORMULA,但确实是三张图片:
那就奇怪了,三个单元格三张图片,怎么使用getAllPictrues方法,就只能拿到两张呢???于是,我去翻了下源码。
可以看到,这个方法获取图片的方式,是用正则表达式去匹配一个类似路径的东西,那么图片被去重应该是因为路径一样。
继续顺藤摸瓜找到这个神秘字符串"/xl/media/"出现的位置,在一番搜索后发现了端倪:
红线圈出来的,就是被封装为FakeZipEntry的图片了,也就是说,在这个时候,图片就已经被去重了!
之后探索的过程发现,之所以POI能读取excel中的图片,其原理是基于java.util.zip的压缩文件读取功能,如果你去把excel文件的后缀强转为.zip的话,再去解压缩,就会发现xl/media的文件夹,然后图片其实在excel中就已经被去重了,所以这个问题是个无解的问题!
思路和操作步骤:
导入Java Poi相关类库,创建ExcelAll的工作簿对象和ExcelSheet对象。
读取Excel1和Excel2中的名为A2的数据单元格,并将这两个单元格中的数值相加。
示例代码:
// 读取Excel1
XSSFWorkbook workbook1 = new XSSFWorkbook(new FileInputStream(new File("path/to/Excel1")));
XSSFSheet sheet1 = workbook1.getSheetAt(0);
XSSFRow row1 = sheet1.getRow(1);
XSSFCell cell1 = row1.getCell(0);
double value1 = cell1.getNumericCellValue();
// 读取Excel2
XSSFWorkbook workbook2 = new XSSFWorkbook(new FileInputStream(new File("path/to/Excel2")));
XSSFSheet sheet2 = workbook2.getSheetAt(0);
XSSFRow row2 = sheet2.getRow(1);
XSSFCell cell2 = row2.getCell(0);
double value2 = cell2.getNumericCellValue();
// 计算结果
double result = value1 + value2;
示例代码:
XSSFWorkbook workbookAll = new XSSFWorkbook(new FileInputStream(new File("path/to/ExcelAll")));
XSSFSheet sheetAll = workbookAll.getSheetAt(0);
XSSFRow rowAll = sheetAll.getRow(1);
XSSFCell cellAll = rowAll.getCell(0);
cellAll.setCellValue(result);
// 保存修改后的ExcelAll
FileOutputStream fileOutputStream = new FileOutputStream("path/to/ExcelAll");
workbookAll.write(fileOutputStream);
fileOutputStream.close();
注:以上示例代码是基于XSSFWorkbook的,如果使用HSSFWorkbook,只需要将XSSFWorkbook改为HSSFWorkbook即可。
参考资料中的段落0和段落1中提供了一些操作Excel单元格样式的代码示例,可根据需要进行调整。由于题目中并没有提到需要添加下拉框限制的需求,故段落2中的相关代码并不适用于本题。