因工作需要,把上百个excel文件合并成一个excel文件。

失败方案一:一个输入流 + 一个输出流,循环读取源文件然后直接写入目标文件。

这种方案有个问题,流是无记忆的。同一个输入流,读取一个指针自动后移一位,但是不同的输入流,完全不知道上个流在做什么。最后的结果就是,目标文件的内容和循环中的最后一个源文件的内容相同....

方案二:为了让写入Excel的内容是接着上一次的位置继续写入的,选择使用HSSFWorkbook。

实现的思路是:在页面里,用户填写源文件地址、目标文件地址和目标文件名,提交后,后台先建立一个Excel目标文件,并且把目标文件和源文件都包装成HSSFWorkbook,然后迭代读取源文件的每个cell并将值存入到目标文件HSSFWorkbook对象中,最终数据写入到目标文件中。这样用户可以在填写的目标目标中找到合并文件。

不过在用HSSFWorkbook包装新创建的.xlsx目标文件时遇到了一个小问题:Unable to read entire header; 0 bytes read; expected 512 bytes,就是说包装对象没有没有表头。

问题语句:File file=File.createTempFile(targetPath+File.separator+fileName);

FileInputStream fis = new FileInputStream(file);

HSSFWorkbook targetWork = new HSSFWorkbook(fis);//出问题语句

所以直接创建的.xlsx是不能用HSSFWorkbook包装的,这种办法也不行。

方案三:在页面里,用户只填写源文件地址,提交后文件直接下载。后台不用再创建目标文件,直接把目标HSSFWorkbook对象写入到response流中。代码如下

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.ss.usermodel.*;

import org.apache.poi.ss.util.CellRangeAddress;

public void excelMerge(HttpServletResponse response, String sourcePath) throws Exception {

// 创建HSSFWorkbook,暂时存放数据

HSSFWorkbook targetWork = new HSSFWorkbook();

HSSFSheet targetSheet = targetWork.createSheet("中石化预分配记录");

targetSheet.setDefaultColumnWidth(20);

targetSheet.setDefaultRowHeightInPoints(20);

// 记录targetWork新建行位置

int targetLineIndex = 0;

// 获取样式集合

Mapstyles = createStyles(targetWork);

//设置标题行

Row titleRow = targetSheet.createRow(targetLineIndex++);

titleRow.setHeightInPoints(30);

Cell titleCell = titleRow.createCell(0);

titleCell.setCellStyle(styles.get("header"));

titleCell.setCellValue("合并文件" + CreateOrderID.getOrderNo());

targetSheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), 4));

// 设置表头行

Row headerRow = targetSheet.createRow(targetLineIndex++);

headerRow.setHeightInPoints(16);

ListheaderList = new ArrayList<>();

headerList.add("卡号");

headerList.add("时间");

headerList.add("金额");

headerList.add("余额");

headerList.add("地址");

for (int i = 0; i < headerList.size(); i++) {

Cell cell = headerRow.createCell(i);

cell.setCellStyle(styles.get("title"));

cell.setCellValue(headerList.get(i));

targetSheet.autoSizeColumn(i);

}

for (int i = 0; i < headerList.size(); i++) {

int colWidth = targetSheet.getColumnWidth(i) * 5;

targetSheet.setColumnWidth(i, colWidth < 3000 ? 3000 : colWidth);

}

HSSFWorkbook workbook;

HSSFSheet sheet;

File sourcePathFile = new File(sourcePath);

for (File file : sourcePathFile.listFiles()) {

if (file.isFile() && file.getName().endsWith(".xlsx")) {

workbook = new HSSFWorkbook(new FileInputStream(file));

sheet = workbook.getSheetAt(0);

for (int i = 2; i < sheet.getLastRowNum(); i++) {

Row sourceRow = sheet.getRow(i);

Row targetRow = targetSheet.createRow(targetLineIndex++);

for (int j = 0; j < sourceRow.getLastCellNum(); j++) {//Cell

Cell cell = sourceRow.getCell(j);

switch (cell.getCellType()) {

case Cell.CELL_TYPE_BLANK:

break;

case Cell.CELL_TYPE_STRING:

System.out.println();

targetRow.createCell(j).setCellValue(cell.getStringCellValue());

break;

case Cell.CELL_TYPE_NUMERIC:

targetRow.createCell(j).setCellValue(cell.getNumericCellValue());

break;

default:

targetRow.createCell(j).setCellValue(cell.toString());

}

}

}

}

}

response.reset();

response.setContentType("application/octet-stream; charset=utf-8");

response.setHeader("Content-Disposition", "attachment; filename=" + Encodes.urlEncode("合并文件" + CreateOrderID.getOrderNo() + ".xlsx"));

targetWork.write(response.getOutputStream());

}

// 工具方法,设置Excel表样式

private MapcreateStyles(Workbook wb) {

Mapstyles = new HashMap<>();

CellStyle style = wb.createCellStyle();

style.setAlignment(CellStyle.ALIGN_CENTER);

style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);

Font titleFont = wb.createFont();

titleFont.setFontName("Arial");

titleFont.setFontHeightInPoints((short) 12);

titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);

style.setFont(titleFont);

styles.put("title", style);

style = wb.createCellStyle();

style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);

style.setBorderRight(CellStyle.BORDER_THIN);

style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());

style.setBorderLeft(CellStyle.BORDER_THIN);

style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());

style.setBorderTop(CellStyle.BORDER_THIN);

style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());

style.setBorderBottom(CellStyle.BORDER_THIN);

style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());

Font dataFont = wb.createFont();

dataFont.setFontName("Arial");

dataFont.setFontHeightInPoints((short) 10);

style.setFont(dataFont);

styles.put("data", style);

style = wb.createCellStyle();

style.setAlignment(CellStyle.ALIGN_LEFT);

style.cloneStyleFrom(styles.get("data"));

styles.put("data1", style);

style = wb.createCellStyle();

style.cloneStyleFrom(styles.get("data"));

style.setAlignment(CellStyle.ALIGN_CENTER);

styles.put("data2", style);

style = wb.createCellStyle();

style.cloneStyleFrom(styles.get("data"));

style.setAlignment(CellStyle.ALIGN_RIGHT);

styles.put("data3", style);

style = wb.createCellStyle();

style.cloneStyleFrom(styles.get("data"));

// style.setWrapText(true);

style.setAlignment(CellStyle.ALIGN_CENTER);

style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());

style.setFillPattern(CellStyle.SOLID_FOREGROUND);

Font headerFont = wb.createFont();

headerFont.setFontName("Arial");

headerFont.setFontHeightInPoints((short) 16);

headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);

headerFont.setColor(IndexedColors.WHITE.getIndex());

style.setFont(headerFont);

styles.put("header", style);

return styles;

}

java合并两个excel文件内容_java实现多个excel文件合并成一个excel文件相关推荐

  1. python合并两个字典的内容,使用update方法

    python合并两个字典的内容,使用update方法 update() 方法可使用一个字典所包含的键值对来更新己有的字典. 在执行 update() 方法时,如果被更新的字典中己包含对应的键值对,那么 ...

  2. PDF合并:如何将两个PDF文件合并成一个PDF文件

    PDF文件是我们在工作中经常能够用到的文件,尤其是在办公中会遇到很多PDF文件在传输的过程中为了传输更快被拆分成了几个PDF文件,但是要找一个完整的PDF文件就需要把两个被拆分的PDF文件合并成一个P ...

  3. 将两个HEX文件合并成一个HEX文件

    将两个HEX文件合并成一个HEX文件 文章目录 将两个HEX文件合并成一个HEX文件 系统环境 1. 生成BootLoader和app的HEX文件 2. 将两个HEX文件合并成一个HEX 3. 利用J ...

  4. java实现多个mav文件拼接合并成一个mav文件

    java实现多个mav文件拼接合并成一个mav文件,绝对有效 解决方法: import java.io.File; import java.io.IOException; import java.io ...

  5. excel合并多个工作表_快速将多个Excel表格合并成一个Excel表格

    之前在微信群内有朋友问我如何快速将多个Excel表格合并成一个Excel表格,当时没有讲解清楚,今天专门来告诉大家如何快速合并Excel表格到一个工作表中. 在合并表格中,不外乎以下两种情况: 将多个 ...

  6. excel如何把多张表合并成一个表_如何快速把多个excel表格合并成一个excel表

    如何快速把多个excel表格合并成一个excel表呢? 首先,我们需要把多个excel表都放在同一个文件夹里面,并在这个文件夹里面新建一个excel文件. 用microsoft excel打开新建的e ...

  7. 将多个txt文本文件合并成一个txt文件

    将多个txt文本文件合并成一个txt文件 方法一:批处理文件 有文档1.txt.2.txt 新建一个文档:合并文档.txt,在该合并文档中输入 copy/b 1.txt+2.txt 3.txt 将合并 ...

  8. 如何将多个Excel表合并成一个Excel表

    如何将多个Excel表合并成一个Excel表 每天需要和Excel办公软件打交道俄小伙伴,他们的电脑桌面上总是布满密密麻麻的Excel表,这样看上去非常的凌乱,其实我们完全可以将其中类别相同的Exce ...

  9. excel几个表合成一张_快速将多个excel表合并成一个excel表

    应用场景:有很多张excel,而且excel表里面的结构基本一样,如何快速将这些excel合并在一个excel页面,便于后期分析和统计 技术实现:利用excel表的宏计算实现. 注意:金山的WPS没有 ...

  10. 如何快速把多个excel表合并成一个excel表(不熟悉vba及公式的人)

    对于不熟悉Excel公式,不熟悉vba的人,要如何按需要快速把多个excel表合并成一个excel表? 对于Excel的合并,很多需要通过vba变成,但对于不熟悉vba编程的人,如何合并呢?给大家推荐 ...

最新文章

  1. Android优化五:布局优化
  2. 阿里云混合云Apsara Stack 2.0发布,加速政企数智创新
  3. php修改数组元素,php数组特定元素修改方法
  4. ostu进行遥感图像的分割
  5. linux strcpy函数实现,strcpy(char *dest , char *src)的漏洞
  6. MacOS 如何显示/隐藏文件
  7. 页面那些位置是投放广告的最佳位置
  8. java 控制jsp_JSP学习之Java Web中的安全控制实例详解
  9. java jndi tcp_spring配置下通过tomcat的jndi服务连接数据库
  10. python排序-堆排序
  11. Java中proc是什么意思,Java PatientProcedureVo.setSignifProc方法代码示例
  12. Linux中使用sftp的常用命令
  13. THREEJS - 动态标签(dom方式)
  14. Node-介绍与模块化
  15. svn在checkout数据仓库aaa时,出现如下错误:
  16. mysql variables详解_MySQL information_schema详解 GLOBAL_VARIABLES和SESSION_VARIABLES
  17. 你一定不知道的 AppStore 秘密
  18. 【Java实现】南京地铁导航系统的简单实现(一)—— 存储站点信息
  19. 新手也可以制作出大片的效果——Movavi Video Editor 15 Plus Mac
  20. 企业邮箱群发邮件 - 邮件群组群发邮件详解

热门文章

  1. 如何快速开通微信小程序的流量主功能
  2. Homography单应性矩阵原理
  3. python100份教材/教程分享学习,初中高级总有适合你的
  4. AcrelEMS-BP生物制药工厂能效管理系统
  5. 切向量,普通矢量,渐变
  6. 嵌入式软件分层设计思想
  7. SEO兵书:搜索引擎优化手册
  8. 13 医疗挂号系统_【 微信登录】
  9. Dwg TrueView 2018中文版
  10. 使用xshell上传文件