前几天遇到一个需求,需要把一个有几万行有规则数据的excel文件拆分成N个excel文件,例如以下excel表格中包括以张三,李四,王五的各科考试成绩,每个学生的学号是唯一的,现在要求把每个人的成绩数据分开来生成独立的表格数据,并以学号作为文件名。

思路: 使用HashMap,用每个工作表作为值,用学号作为键。遍历原始工作表中的每一行,以学号为键去HashMap对象中取工作表,如果不存在,那么主新建一个工作表,写入此行数据并保存工作表在HashMap对象中。如果以当前行的学号作为键可以取到工作表,则取出工作表,并将当前行写入工作表,并重新保存工作表到HashMap对象中。最后遍历HashMap对象,重新生成Excel文件。

以下为实现代码

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.FileInputStream;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

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

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

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.usermodel.WorkbookFactory;

import org.apache.poi.xssf.usermodel.XSSFCellStyle;

import org.apache.poi.xssf.usermodel.XSSFDataFormat;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelSplit {

public static void main(String[] args){

try {

System.out.println("开始拆分.....");

Map map=getSplitMap("D:/xxxx.xlsx");//得到拆分后的子文件存储对象

createSplitXSSFWorkbook(map, "D:/splitdone/201404", "2014.04");//遍历对象生成的拆分文件

System.out.println("拆分结束,文件被拆分为"+map.size()+"个文件.");

} catch (Exception e) {

e.printStackTrace();

}

}

//将第一列的值作为键值,将一个文件拆分为多个文件

public static Map getSplitMap(String fileName) throws Exception{

Map map=new HashMap();

InputStream is = new FileInputStream(new File(fileName));

//根据输入流创建Workbook对象

Workbook wb = WorkbookFactory.create(is);

//get到Sheet对象

Sheet sheet = wb.getSheetAt(0);

Row titleRow=null;

//这个必须用接口

int i=0;

for(Row row : sheet){//遍历每一行

if(i==0){

titleRow=row;//得到标题行

}else{

Cell keyCell=row.getCell(0);

String key=keyCell.getRichStringCellValue().toString();

XSSFWorkbook tempWorkbook=map.get(key);

if(tempWorkbook==null){//如果以当前行第一列值作为键值取不到工作表

tempWorkbook= new XSSFWorkbook();

Sheet tempSheet=tempWorkbook.createSheet();

Row firstRow=tempSheet.createRow(0);

for(short k=0;k

Cell c=titleRow.getCell(k);

Cell newcell=firstRow.createCell(k);

newcell.setCellValue(c.getStringCellValue());

}

map.put(key,tempWorkbook);

}

Sheet secSheet=tempWorkbook.getSheetAt(0);

Row secRow=secSheet.createRow(secSheet.getLastRowNum()+1);

for(short m=0;m

Cell newcell=secRow.createCell(m);

setCellValue(newcell,row.getCell(m),tempWorkbook);

}

map.put(key,tempWorkbook);

}

i=i+1;//行数加一

}

return map;

}

//创建文件

public static void createSplitXSSFWorkbook(Map map,String savePath,String month)

throws IOException {

Iterator iter = map.entrySet().iterator();

while (iter.hasNext()) {

Map.Entry entry = (Map.Entry) iter.next();

String key = (String) entry.getKey();

XSSFWorkbook val = (XSSFWorkbook) entry.getValue();

File filePath=new File(savePath);

if(!filePath.exists()){

System.out.println("存放目录不存在,自动为您创建存放目录.");

filePath.mkdir();

}

if(!filePath.isDirectory()){

System.out.println("无效文件目录");

return ;

}

File file=new File(savePath+"/"+key+"_"+month+".xlsx");

FileOutputStream fOut;// 新建输出文件流

try {

fOut = new FileOutputStream(file);

val.write(fOut); // 把相应的Excel工作薄存盘

fOut.flush();

fOut.close(); // 操作结束,关闭文件

} catch (FileNotFoundException e) {

System.out.println("找不到文件");

}

}

}

//将一个单元格的值赋给另一个单元格

public static void setCellValue(Cell newCell,Cell cell,XSSFWorkbook wb){

if(cell==null){

return;

}

switch(cell.getCellType()){

case Cell.CELL_TYPE_BOOLEAN:

newCell.setCellValue(cell.getBooleanCellValue());

break;

case Cell.CELL_TYPE_NUMERIC:

if(DateUtil.isCellDateFormatted(cell)){

XSSFCellStyle cellStyle =wb.createCellStyle();

XSSFDataFormat format= wb.createDataFormat();

cellStyle.setDataFormat(format.getFormat("yyyy/m/d"));

newCell.setCellStyle(cellStyle);

newCell.setCellValue(cell.getDateCellValue());

}else{

//读取数字

newCell.setCellValue(cell.getNumericCellValue());

}

break;

case Cell.CELL_TYPE_FORMULA:

newCell.setCellValue(cell.getCellFormula());

break;

case Cell.CELL_TYPE_STRING:

newCell.setCellValue(cell.getStringCellValue());

break;

}

}

}

有任何问题请联系qq 359709421

如果您觉得我的文章给了您帮助,请为我买一杯饮料吧!以下是我的支付宝,意思一下我将非常感激!

java拆分excel_apache poi拆分excel表格相关推荐

  1. java中poi导出Excel表格(前台流文件接收)

    java中poi导出Excel表格,前端以流的方式接收,而非直接生成文件再下载,解决多台服务器部署后,路径地址不统一导致的下载问题. 生成Excel示例图: 2.代码说明 ① 在上次的基础上增加了底部 ...

  2. java poi对Excel表格进行单元行删除

    java poi对Excel表格进行单元行删除 前几天工作时,突然需要去使用POI 来对Excel 表格进行操作,其他的操作都都没什么问题,但是在需要删除某些单元行的时候碰到了一下小坑,记录下来,防止 ...

  3. java excel 边框_【web开发】☆★之利用POI操作Excel表格系列教程【9】单元格边框处理...

    [web开发]☆★之利用POI操作Excel表格系列教程[9]单元格边框处理 package csg.xiaoye.poidemo; import java.io.FileOutputStream; ...

  4. Java web项目利用POI导出EXCEL表格

    SSH2 POI导出EXCEL表格 1.首先导入poi的jar包 HSSFWorkbook :工作簿,代表一个excel的整个文档 HSSFSheet:工作表 HSSFRow :行 HSSFCell: ...

  5. java中使用jxl导出excel表格的工具类(全网唯一亲测可用,在原来基础上扩展)

    java中后台导出excel的话,有两种方案,一是使用poi(不过由于是windows版本的,存在不兼容,但功能更多,更强大),而是使用jxl(纯java编写,不过兼容,简单一些),可以设置输出的ex ...

  6. 【web开发】☆★之利用POI操作Excel表格系列教程【6】遍历工作簙行和列取值

    [web开发]☆★之利用POI操作Excel表格系列教程[6]遍历工作簙行和列取值 package com.xiaoye.demo; import java.io.FileInputStream; i ...

  7. POI解析Excel表格

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 这里实现poi解析Excel表格的例子,导入Exc ...

  8. POI设置Excel表格的单元格格式及处理大数的科学计数问题

    一.POI设置Excel表格的单元格格式(在导出Excel表时设置各个单元格格式) 1.Excel的单元格格式  图中的数据有数值.货币.时间.日期.文本等格式.这些数据格式在POI中的HSSFDat ...

  9. 使用POI读取Excel表格中数据

    使用POI读取Excel表格中数据 已经在 使用POI读取Excel表格中数据2优化.(https://blog.csdn.net/qq_36570464/article/details/107053 ...

最新文章

  1. IDE set arguments
  2. 打工人,今年双十一你刷啥?
  3. bartender2020中文版
  4. github Android-Universal-Image-Loader
  5. 3月更新来了!Windows 11正式版22000.556发布
  6. 静态变量读取属性文件_一种通过变量插值读取属性的方法
  7. MyBatis注解模式批量insert方法
  8. [js] ReferenceError和TypeError有什么区别?
  9. 记录配置fast rcnn(caffe)仅CPU遇到的问题
  10. qt纯c++编程增加多线程支持库
  11. R-WipeClean(磁盘清理工具)v20.0.2230绿色版
  12. 高阶篇:4.1.2)QFDII(设计要求逐层分配给各零件)
  13. 如何解决同花顺软件打开时,出现 “无法与服务器建立连接” 的问题
  14. 数模学习(七)--- 多元线性回归
  15. element click intercepted
  16. 用计算机打爸爸妈妈,看图写话打电脑
  17. 使用video标签时报错 Uncaught (in promise) DOMException
  18. 什么叫单模光纤_什么是OS1,OS2的单模光纤
  19. midi java_java midi音乐文件播放器
  20. 蚂蚁金服分布式中间件开源第三弹: 下一代微服务SOFAMesh

热门文章

  1. 6.Python常用第三方库—jieba库的使用(中文分词词库)
  2. Qt窗口之间传值和结构体数据
  3. 【java之汉字转拼音】
  4. ASEMI大功率场效应管和三极管的区别
  5. git pull 与 git push 的区别
  6. 鼠标经过图片 图片放大缩小
  7. 中间件漏洞(Apache篇)
  8. MVC框架基本工作原理
  9. 计算机主机恢复上电检查,电脑故障维修判断指导总结
  10. 安装nginx遇到C compiler cc is not fount问题