设为首页 收藏本站
查看: 676|回复: 0

[经验分享] apache poi拆分excel表格

[复制链接]

尚未签到

发表于 2017-1-2 06:40:42 | 显示全部楼层 |阅读模式
  前几天遇到一个需求,需要把一个有几万行有规则数据的excel文件拆分成N个excel文件,例如以下excel表格中包括以张三,李四,王五的各科考试成绩,每个学生的学号是唯一的,现在要求把每个人的成绩数据分开来生成独立的表格数据,并以学号作为文件名。
DSC0000.jpg

  思路: 使用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<String, XSSFWorkbook> 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<String,XSSFWorkbook> getSplitMap(String fileName) throws Exception{
Map<String,XSSFWorkbook> map=new HashMap<String,XSSFWorkbook>();
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<titleRow.getLastCellNum();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<row.getLastCellNum();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<String, XSSFWorkbook> 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

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

DSC0001.jpg

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-322496-1-1.html 上篇帖子: Apache的使用点滴 下篇帖子: 实现Apache虚拟主机
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表