【VIP专享】java 导出excel 增量写入同一sheet
Java导入导出excel,easypoi的简单使用
![Java导入导出excel,easypoi的简单使用](https://img.taocdn.com/s3/m/4a687cca2dc58bd63186bceb19e8b8f67c1cef40.png)
Java导⼊导出excel,easypoi的简单使⽤基于spring boot框架,先上pom配置<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.0.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>4.0.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.0.0</version></dependency>实体类package com.vo;import cn.afterturn.easypoi.excel.annotation.Excel;import com.baomidou.mybatisplus.annotation.TableName;import mon.data.entity.CurdEntity;@TableName("wx_user")public class User extends CurdEntity {@Excel(name = "姓名")String name;@Excel(name = "⽤户")String user;@Excel(name = "年龄")int groupValue;public int getGroupValue() {return groupValue;}public void setGroupValue(int groupValue) {this.groupValue = groupValue;}public String getName() {return name;}public void setName(String name) { = name;}public String getUser() {return user;}public void setUser(String user) {er = user;}}通⽤⽅法类package mon.util;import cn.afterturn.easypoi.excel.ExcelExportUtil;import cn.afterturn.easypoi.excel.ExcelImportUtil;import cn.afterturn.easypoi.excel.entity.ExportParams;import cn.afterturn.easypoi.excel.entity.ImportParams;import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;import ng3.StringUtils;import ermodel.Workbook;import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;import java.io.File;import java.io.IOException;import .URLEncoder;import java.util.List;import java.util.Map;import java.util.NoSuchElementException;/*** @Description: 表格⼯具类*/public class PoiUtils {public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) { ExportParams exportParams = new ExportParams(title, sheetName);exportParams.setCreateHeadRows(isCreateHeader);defaultExport(list, pojoClass, fileName, response, exportParams);}public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response) {defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));}public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {defaultExport(list, fileName, response);}private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);if (workbook != null) ;downLoadExcel(fileName, response, workbook);}private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {try {response.setCharacterEncoding("UTF-8");response.setHeader("content-Type", "application/vnd.ms-excel");response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));workbook.write(response.getOutputStream());} catch (IOException e) {throw new RuntimeException(e.getMessage());}}private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);if (workbook != null) ;downLoadExcel(fileName, response, workbook);}/*** 导⼊* @param filePath* @param titleRows* @param headerRows* @param pojoClass* @param <T>* @return*/public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass) {if (StringUtils.isBlank(filePath)) {return null;}ImportParams params = new ImportParams();params.setTitleRows(titleRows);params.setHeadRows(headerRows);List<T> list = null;try {list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);} catch (NoSuchElementException e) {throw new RuntimeException("模板不能为空");} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e.getMessage());}return list;}/*** 导⼊表格* @param file* @param pojoClass* @param <T>* @return*/public static <T> List<T> importExcel(MultipartFile file, Class<T> pojoClass) {if (file == null) {return null;}ImportParams params = new ImportParams();try {List<T> list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);return list;} catch (NoSuchElementException e) {throw new RuntimeException("excel⽂件不能为空");} catch (Exception e) {throw new RuntimeException(e.getMessage());}}}接⼝调⽤相关⽅法,这⾥演⽰⼀下导⼊功能@PostMapping("excelList")//批量保存,⼀条保存失败,数据全部回滚,测试事务是否⽣效public MsgDataBody excelList(MultipartFile file){MsgDataBody<List<User>> msgBody = new MsgDataBody();msgBody.setCode(Constant.Error.getCode());msgBody.setMsg("导⼊失败");try {List<User> userList = PoiUtils.importExcel(file,User.class);/** 相关导⼊操作* */msgBody.setData(userList);msgBody.setCode(Constant.Success.getCode());msgBody.setMsg("导⼊失败");}catch (Exception e){msgBody.setMsg("导⼊失败["+e.getMessage()+"]");}return msgBody;}更多的easypoi教程可以看官⽹教程:。
Java中Easypoi实现excel多sheet表导入导出功能
![Java中Easypoi实现excel多sheet表导入导出功能](https://img.taocdn.com/s3/m/4e9ff20554270722192e453610661ed9ad5155fd.png)
Java中Easypoi实现excel多sheet表导⼊导出功能Easypoi简化了开发中对⽂档的导⼊导出实现,并不像poi那样都要写⼤段⼯具类来搞定⽂档的读写。
第⼀步引⼊Easypoi依赖<!-- 导出⽂件⼯具 EasyPoi实现Excel读写管理测试⽤例 --><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.2.0</version></dependency>Easypoi的注解使⽤说明(存留查看即可)第⼆步定义对应表格头数据对象实体类(注解的使⽤可以查阅上⾯的按需使⽤即可)@Setter@Getter@ToStringpublic class LoginCaseDto {@Excel(name = "flag(0是反向,1是正向)",orderNum = "1",width = 20)private String flag;@Excel(name = "urlid(访问id)",orderNum = "2",width = 20)private String urlid;@Excel(name = "name(登录账号)",orderNum = "3",width = 20)private String name;@Excel(name = "pwd(登录密码)",orderNum = "4",width = 20)private String pwd;@Excel(name = "desc(期望提⽰语)",orderNum = "5",width = 40)private String desc;@Excel(name = "actual(实际测试结果)",orderNum = "6",width = 40 )private String actual;@Excel(name = "urlpath(被测路径)",orderNum = "7",width = 40 )private String urlpath;}public class LoginUrlDto {@Excel(name = "id(访问测试类型)",orderNum = "1",width = 20)private String id;@Excel(name = "type(请求类型)",orderNum = "2",width = 20)private String type;@Excel(name = "url(访问地址)",orderNum = "3",width = 40)private String url;}第三步:封装Easypoi⼯具类(⽹上查了很多但是并不完整,这⾥补充下)关键封装⼯具类多sheet导⼊⽅法/*** 功能描述:根据接收的Excel⽂件来导⼊多个sheet,根据索引可返回⼀个集合* @param filePath 导⼊⽂件路径* @param sheetIndex 导⼊sheet索引* @param titleRows 表标题的⾏数* @param headerRows 表头⾏数* @param pojoClass Excel实体类* @return*/public static <T> List<T> importExcel(String filePath,int sheetIndex,Integer titleRows, Integer headerRows, Class<T> pojoClass) {// 根据file得到Workbook,主要是要根据这个对象获取,传过来的excel有⼏个sheet页ImportParams params = new ImportParams();// 第⼏个sheet页params.setStartSheetIndex(sheetIndex);params.setTitleRows(titleRows);params.setHeadRows(headerRows);List<T> list = null;try {list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);} catch (NoSuchElementException e) {throw new RuntimeException("模板不能为空");} catch (Exception e) {e.printStackTrace();}return list;}excel导⼊⽰例(直接传⼊sheet索引获取对应的sheet表)多sheet表导出⽅法使⽤(需要把导⼊的多sheet表数据转成list集合获取新数据后调⽤该⽅法重新写⼊)/*** 功能描述:把同⼀个表格多个sheet测试结果重新输出,如果后续增加多个List<Map<String, Object>>对象,需要后⾯继续追加* @ExcelEntiry sheet表格映射的实体对象* @return*/public static String exportSheet( Object...objects){Workbook workBook = null;try {// 创建参数对象(⽤来设定excel得sheet得内容等信息)ExportParams deptExportParams = new ExportParams();// 设置sheet得名称deptExportParams.setSheetName("登录⽤例");// 设置sheet表头名称deptExportParams.setTitle("测试⽤例");// 创建sheet1使⽤得mapMap<String, Object> deptExportMap = new HashMap<>();// title的参数为ExportParams类型,⽬前仅仅在ExportParams中设置了sheetNamedeptExportMap.put("title", deptExportParams);// 模版导出对应得实体类型deptExportMap.put("entity", LoginCaseDto.class);// sheet中要填充得数据deptExportMap.put("data", objects[0]);ExportParams empExportParams = new ExportParams();empExportParams.setTitle("被测RUL路径");empExportParams.setSheetName("被测url");// 创建sheet2使⽤得mapMap<String, Object> empExportMap = new HashMap<>();empExportMap.put("title", empExportParams);empExportMap.put("entity", LoginUrlDto.class);empExportMap.put("data", objects[1]);// 将sheet1、sheet2使⽤得map进⾏包装List<Map<String, Object>> sheetsList = new ArrayList<>();sheetsList.add(deptExportMap);sheetsList.add(empExportMap);// 执⾏⽅法workBook = EasyPoiUtil.exportExcel(sheetsList, ExcelType.HSSF);//String fileName = URLEncoder.encode("test", "UTF-8");String filepath = (String) LoadStaticConfigUtil.getCommonYml( "testcaseexcel.cases");FileOutputStream fos = new FileOutputStream(filepath);workBook.write(fos);fos.close();}catch (Exception e){e.printStackTrace();}finally {if(workBook != null) {try {workBook.close();} catch (IOException e) {e.printStackTrace();}}}return "success";}最后即可获取新的测试结果表格。
Java数据导入导出Excel
![Java数据导入导出Excel](https://img.taocdn.com/s3/m/168493c59ec3d5bbfd0a7481.png)
import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.List;import jxl.Workbook;import jxl.format.UnderlineStyle;import bel;import jxl.write.WritableFont;import jxl.write.WritableSheet;import jxl.write.WritableWorkbook;import jxl.write.WriteException;import jxl.write.biff.RowsExceededException;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import org.apache.poi.poifs.filesystem.POIFSFileSystem;public class ExcelOpt {/*** 生成一个Excel文件jxl* @param fileName 要生成的Excel文件名* @jxl.jar 版本:2.6*/public static void writeExcel(String fileName){WritableWorkbook wwb = null;try {//首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象wwb = Workbook.createWorkbook(new File(fileName));} catch (IOException e) {e.printStackTrace();}if(wwb!=null){//创建一个可写入的工作表//Workbook的createSheet方法有两个参数,第一个是工作表的名称,第二个是工作表在工作薄中的位置WritableSheet ws = wwb.createSheet("工作表名称", 0);//下面开始添加单元格for(int i=0;i<10;i++){for(int j=0;j<5;j++){//这里需要注意的是,在Excel中,第一个参数表示列,第二个表示行Label labelC = new Label(j, i, "这是第"+(i+1)+"行,第"+(j+1)+"列");try {//将生成的单元格添加到工作表中ws.addCell(labelC);} catch (RowsExceededException e) {e.printStackTrace();} catch (WriteException e) {e.printStackTrace();}}}try {//从内存中写入文件中wwb.write();//关闭资源,释放内存wwb.close();} catch (IOException e) {e.printStackTrace();} catch (WriteException e) {e.printStackTrace();}}}/*** 生成一个Excel文件POI* @param inputFile 输入模板文件路径* @param outputFile 输入文件存放于服务器路径* @param dataList 待导出数据* @throws Exception* @roseuid:*/public static void exportExcelFile(String inputFile,String outputFile,List dataList) throws Exception{//用模板文件构造poiPOIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(inputFile));//创建模板工作表HSSFWorkbook templatewb = new HSSFWorkbook(fs);//直接取模板第一个sheet对象HSSFSheet templateSheet = templatewb.getSheetAt(1);//得到模板的第一个sheet的第一行对象为了得到模板样式HSSFRow templateRow = templateSheet.getRow(0);//HSSFSheet timplateSheet = templatewb.getSheetAt(1);//取得Excel文件的总列数int columns = templateSheet.getRow((short) 0).getPhysicalNumberOfCells();// Debug.println("columns is : " + columns); //========================= //创建样式数组HSSFCellStyle styleArray[] = new HSSFCellStyle[columns];//一次性创建所有列的样式放在数组里for (int s = 0; s < columns; s++) {//得到数组实例styleArray[s] = templatewb.createCellStyle();} 循环对每一个单元格进行赋值//定位行for (int rowId = 1; rowId < dataList.size(); rowId++) {//依次取第rowId行数据每一个数据是valueListList valueList = (List) dataList.get(rowId - 1);//定位列for (int columnId = 0; columnId < columns; columnId++) {//依次取出对应与colunmId列的值//每一个单元格的值String dataValue = (String) valueList.get(columnId);//取出colunmId列的的style//模板每一列的样式HSSFCellStyle style = styleArray[columnId];//取模板第colunmId列的单元格对象//模板单元格对象HSSFCell templateCell = templateRow.getCell((short) columnId);//创建一个新的rowId行行对象//新建的行对象HSSFRow hssfRow = templateSheet.createRow(rowId);//创建新的rowId行columnId列单元格对象//新建的单元格对象HSSFCell cell = hssfRow.createCell((short) columnId);//如果对应的模板单元格样式为非锁定if (templateCell.getCellStyle().getLocked() == false) {//设置此列style为非锁定style.setLocked(false);//设置到新的单元格上cell.setCellStyle(style);}//否则样式为锁定else {//设置此列style为锁定style.setLocked(true);//设置到新单元格上cell.setCellStyle(style);}//设置编码cell.setEncoding(HSSFCell.ENCODING_UTF_16);//Debug.println("dataValue : " + dataV alue);//设置值统一为Stringcell.setCellValue(dataV alue);}}//设置输入流FileOutputStream fOut = new FileOutputStream(outputFile);//将模板的内容写到输出文件上templatewb.write(fOut);fOut.flush();//操作结束,关闭文件fOut.close();}/*** 导出数据为XLS格式* @param fos 生成Excel文件Path* @param bo 要导入的数据*/public static void writeExcelBo(String fos, java.util.List ve) {jxl.write.WritableWorkbook wwb;try{wwb= Workbook.createWorkbook(new File(fos));jxl.write.WritableSheet ws= wwb.createSheet("上市新书", 10);ws.addCell(new bel(0, 1, "书名"));ws.addCell(new bel(1, 1, "作者"));ws.addCell(new bel(2, 1, "定价"));ws.addCell(new bel(3, 1, "出版社"));int bookSize=ve.size();BookVO book = new BookVO();for (int i= 0; i < bookSize; i++){book= (BookVO)ve.get(i);ws.addCell(new bel(0, i + 2, "" + book.getBookName()));ws.addCell(new bel(1, i + 2, book.getBookAuthor()));ws.addCell(new bel(2, i + 2, "" + book.getBookPrice()));ws.addCell(new bel(3, i + 2, book.getBookConcern()));}// jxl.write.WritableFont wfc=//newjxl.write.WritableFont(WritableFont.ARIAL,255,WritableFont.BOLD,false,UnderlineStyle.NO_U NDERLINE,jxl.format.Colour.BLACK);//jxl.write.WritableCellFormat wcfFC= new jxl.write.WritableCellFormat(wfc);ws.addCell(new bel(0, 0, "2007年07月即将上市新书!"));wwb.write();// 关闭Excel工作薄对象wwb.close();} catch (IOException e){} catch (RowsExceededException e){} catch (WriteException e){}}public static void main(String[] args) {writeExcel("c:\\Test测试Excel.xls");System.out.println("OK");ArrayList list = new ArrayList();for (int i = 0; i < 10; i++) {BookVO book = new BookVO();book.setBookName("WebWork in action+"+i);book.setBookAuthor("唐勇+"+i);book.setBookPrice("39元+"+i);book.setBookConcern("飞思科技+"+i);list.add(book);}writeExcelBo("c:\\上市新书.xls",list);System.err.println("Book OK!!!");}}=================摘要=====================java如何操作Excel(数据导入导出)(转)jxl.jar,可以到下载。
HutoolJava工具类库导出Excel并合并数据,全网最详细!
![HutoolJava工具类库导出Excel并合并数据,全网最详细!](https://img.taocdn.com/s3/m/d2602f725bcfa1c7aa00b52acfc789eb172d9e6d.png)
HutoolJava⼯具类库导出Excel并合并数据,全⽹最详细!ps:基于HuTool⼯具类ExcelWriter合并单元格并且使⽤ jdk1.8 lambda表达式⼀、原始数据模板⼆、合并后的数据按照班级名称、班级分数、⼩组名称、⼩组得分、⼈物名称、⼈物总分进⾏单元格合并合并后效果:三、导⼊依赖ps:pom依赖版本不合适可以换其他版本导出是项⽬中最常见的功能,例如考勤记录导出,账单明细导出,订单记录导出等等。
导出的⼯具类有许多种,⽬前常见的有poi,easypoi,poi...,今天我要说的是基于hutool-poi的导出,hutool-poi是将poi做了封装,简化了⼤量的代码编写。
使⽤⽅式:maven在项⽬的pom.xml中引⼊<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.5.1</version></dependency>gradle在项⽬的build.gradle中引⼊compile 'cn.hutool:hutool-all:5.7.3'四、代码逻辑1.查找数据库返回数据voList;2.设置导出表头数据;3.⽤lambda表达式获取字段分组数据;4.遍历数据,设置合并规则;5.将数据保存在list中;6.ExcelWriter导出excel⽂件五、代码1.需实现将⼈物信息导出到excel⽂件中并且还要按照班级名称,⼩组名称,⼈物名称动态合并单元格,所以先创建⼈物对象:@Data@AllArgsConstructor //⽣成所有参数的构造器public class Person {//班级名称private String className;//班级分数private double classScore;//⼩组名称private String groupName;//⼩组分数private double groupScore;//⼈物姓名private String personName;//⼈物总分private double personScore;//学科名称private String subjectName;//学科分数private double subjectScore;}2.导出核⼼代码:@Slf4j@RestController@RequestMapping("/person")public class PersonController {/*** 将页⾯的数据导出并合并单元格* @param response*/@ApiOperation(value = "导出数据到excel")@ApiImplicitParams({@ApiImplicitParam(name = "response", value = "响应体对象", dataType = "HttpServletResponse")})@GetMapping("/export")public void export(HttpServletResponse response)throws Exception{//1.模拟⼀些⼈物对象数据(⼯作中从数据库查出来)List<Person> list = new ArrayList<>();list.add(new Person("⼀班",90,"⼀组",89,"孙悟空",89,"语⽂",89));list.add(new Person("⼀班",90,"⼀组",89,"孙悟空",89,"数学",98));list.add(new Person("⼀班",90,"⼀组",89,"唐僧",78,"语⽂",98));list.add(new Person("⼀班",90,"⼀组",89,"唐僧",78,"数学",78));list.add(new Person("⼀班",90,"⼆组",90,"沙悟净",90,"语⽂",90));list.add(new Person("⼀班",90,"⼆组",90,"沙悟净",90,"数学",90));list.add(new Person("⼆班",91,"⼀组",97,"鲁智深",98,"语⽂",89));list.add(new Person("⼆班",91,"⼀组",97,"鲁智深",98,"数学",98));list.add(new Person("⼆班",91,"⼆组",89,"宋江",89,"语⽂",98));list.add(new Person("⼆班",91,"⼆组",89,"宋江",89,"数学",78));list.add(new Person("⼆班",91,"⼆组",89,"林冲",88,"语⽂",90));list.add(new Person("⼆班",91,"⼆组",89,"林冲",88,"数学",90));//2.定义基础数据List<String> rowHead = CollUtil.newArrayList("班级名称","班级分数","⼩组名称","⼩组分数","⾓⾊姓名","⾓⾊总分","学科名称","学科分数");//3.通过ExcelUtil.getBigWriter()创建Writer对象,BigExcelWriter⽤于⼤数据量的导出,不会引起溢出;ExcelWriter writer = ExcelUtil.getBigWriter();//4.写⼊标题writer.writeHeadRow(rowHead);ServletOutputStream out = null;//5.实现核⼼逻辑try {//6.定义容器保存⼈物数据List<List<Object>> rows = new LinkedList<>();//7.按照班级进⾏分组LinkedHashMap<String, List<Person>> classList = list.stream().collect(Collectors.groupingBy(item -> item.getClassName(),LinkedHashMap::new, Collectors.toList()));//8.定义起始⾏(⽅便分组后合并时从哪⼀⾏开始)//因为标题已经占了⼀⾏,所以数据从第⼆⾏开始写(excel第⼀⾏索引为0)//因需要合并到⼈物分数单元格所以需定义如下起始坐标int indexClassName = 1; //班级名称起始⾏int indexClassScore = 1;int indexGroupName = 1;int indexGroupScore = 1;int indexPersonName = 1;int indexPersonScore = 1;//9.遍历按班级名分组后的list(⽤entrySet效率⽐keySet效率⾼)for (Map.Entry<String, List<Person>> classNameListEntry : classList.entrySet()) {//10.获取按照班级名分组后的集合List<Person> classValue = classNameListEntry.getValue();//11.计算此集合的长度int classSize = classValue.size();//12.如果只有⼀⾏数据不能调⽤merge⽅法合并数据,否则会报错if (classSize == 1){indexClassName += classSize;indexClassScore += classSize;indexGroupName += classSize;indexGroupScore += classSize;indexPersonName += classSize;indexPersonScore += classSize;}else{//13.根据班级名称进⾏合并单元格//合并⾏,第⼀个参数是合并⾏的开始⾏号(⾏号从0开始),第⼆个参数是合并⾏的结束⾏号,第三个参数是合并的列号开始(列号从0开始), //第四个参数是合并的列号结束,第五个参数是合并后的内容,null不设置,第六个参数指是否⽀持设置样式,true指的是。
java自定义注解在excel导出时的使用
![java自定义注解在excel导出时的使用](https://img.taocdn.com/s3/m/8480dc2d6fdb6f1aff00bed5b9f3f90f76c64da3.png)
java自定义注解在excel导出时的使用在Java中,自定义注解是一种用于在程序中进行标记的机制。
通过定义自己的注解,可以为类、方法、字段等元素添加元数据,用于描述它们的特性和行为。
在Excel导出时,自定义注解可以用来定义导出的字段和格式,并且可以通过反射机制来读取注解信息,实现自动导出的功能。
下面是一个简单的自定义注解示例:```javaimport ng.annotation.*;String name( default ""; // 导出字段的名称int width( default 20; // 导出字段的宽度String format( default ""; // 导出字段的格式```定义了注解之后,可以在需要导出的类中使用该注解对字段进行标记。
例如:```javapublic class Userprivate String name;private int age;//其他字段和方法...```接下来,可以编写一个用于导出Excel的工具类。
该类可以使用反射来读取类的字段和注解信息,并根据注解信息生成相应的Excel文件。
以下是一个简单的Excel导出工具类示例:```javapublic class ExcelExportUtilpublic static <T> void exportToExcel(List<T> data, Class<T> clazz, String filePath)//创建工作簿和工作表Workbook workbook = new HSSFWorkbook(;Sheet sheet = workbook.createSheet("Sheet1");//获取类的字段和注解信息Field[] fields = clazz.getDeclaredFields(;for (int i = 0; i < fields.length; i++)Field field = fields[i];ExcelField excelField =field.getAnnotation(ExcelField.class);if (excelField != null)//获取注解信息String fieldName = (;int width = excelField.width(;//设置列宽sheet.setColumnWidth(i, width * 256);//创建表头单元格Row headerRow = sheet.getRow(0);if (headerRow == null)headerRow = sheet.createRow(0);}Cell headerCell = headerRow.createCell(i); headerCell.setCellValue(fieldName);}}//创建数据行for (int i = 0; i < data.size(; i++)T item = data.get(i);Row dataRow = sheet.getRow(i + 1);if (dataRow == null)dataRow = sheet.createRow(i + 1);}for (int j = 0; j < fields.length; j++)Field field = fields[j];if (field.isAccessible()try//获取字段值Object value = field.get(item);//创建数据单元格并填充数据Cell dataCell = dataRow.createCell(j); if (value instanceof String) dataCell.setCellValue((String) value); } else if (value instanceof Integer) dataCell.setCellValue((int) value);} else if (value instanceof Double) dataCell.setCellValue((double) value); }} catch (IllegalAccessException e)e.printStackTrace(;}}}}// 保存Excel文件try (FileOutputStream outputStream = newFileOutputStream(filePath))workbook.write(outputStream);} catch (IOException e)e.printStackTrace(;}}```在上面的示例中,exportToExcel方法接收一个泛型列表和类的字节码对象,通过反射来读取类的字段和注解信息,并根据注解信息生成Excel文件。
java实现导出Excel(跨行跨列)
![java实现导出Excel(跨行跨列)](https://img.taocdn.com/s3/m/17dba80911661ed9ad51f01dc281e53a59025165.png)
java实现导出Excel(跨行跨列)在Java中,可以使用Apache POI库来实现导出Excel文件,并且可以实现跨行和跨列的功能。
Apache POI是一个开源的Java库,可以处理Microsoft Office格式的文档,包括Excel。
以下是使用Apache POI库实现导出Excel文件的步骤:1. 首先,需要引入Apache POI依赖。
可以在Maven或Gradle中添加以下依赖项:```xml<!-- Apache POI --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>2. 创建一个Workbook对象,该对象代表一个Excel文件:```javaWorkbook workbook = new XSSFWorkbook(;```3. 创建一个Sheet对象,该对象代表Excel文件中的一个工作表:```javaSheet sheet = workbook.createSheet("Sheet1");```4. 创建行和单元格,根据需要设置跨行和跨列的属性。
可以使用CellRangeAddress类来实现跨行和跨列的功能:```javaRow row = sheet.createRow(0);Cell cell = row.createCell(0);cell.setCellValue("跨行跨列");//合并单元格,从第1行到第3行,从第1列到第5列CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 2, 0, 4);sheet.addMergedRegion(cellRangeAddress);5. 将数据写入Excel文件中的单元格:```javaRow row = sheet.createRow(0);Cell cell = row.createCell(0);cell.setCellValue("Hello");```6. 将Workbook对象写入到文件中:```javaFileOutputStream fileOutputStream = new FileOutputStream("output.xlsx");workbook.write(fileOutputStream);fileOutputStream.close(;```完整的示例代码如下所示:```javaimport ermodel.*;import org.apache.poi.ss.util.CellRangeAddress;import ermodel.XSSFWorkbook;import java.io.FileOutputStream;import java.io.IOException;public class ExcelExporterpublic static void main(String[] args) throws IOExceptionWorkbook workbook = new XSSFWorkbook(;Sheet sheet = workbook.createSheet("Sheet1");Row row = sheet.createRow(0);Cell cell = row.createCell(0);cell.setCellValue("跨行跨列");//合并单元格,从第1行到第3行,从第1列到第5列CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 2, 0, 4);sheet.addMergedRegion(cellRangeAddress);FileOutputStream fileOutputStream = newFileOutputStream("output.xlsx");workbook.write(fileOutputStream);fileOutputStream.close(;System.out.println("Excel文件导出成功!");}```执行该代码后,会在项目的根目录下生成一个名为`output.xlsx`的Excel文件,其中包含一个跨行和跨列的单元格。
java导出excel浏览器直接下载或者或以文件形式导出
![java导出excel浏览器直接下载或者或以文件形式导出](https://img.taocdn.com/s3/m/455c1af8541810a6f524ccbff121dd36a32dc435.png)
java导出excel浏览器直接下载或者或以⽂件形式导出看代码吧~/*** excel表格直接下载*/public static void exportExcelByDownload(HSSFWorkbook wb,HttpServletResponse httpServletResponse,String fileName) throws Exception {//响应类型为application/octet- stream情况下使⽤了这个头信息的话,那就意味着不想直接显⽰内容httpServletResponse.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);//attachment为以附件⽅式下载httpServletResponse.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName + ".xls","utf-8"));/*** 代码⾥⾯使⽤Content-Disposition来确保浏览器弹出下载对话框的时候。
* response.addHeader("Content-Disposition","attachment");⼀定要确保没有做过关于禁⽌浏览器缓存的操作*/httpServletResponse.setHeader("Cache-Control", "No-cache");httpServletResponse.flushBuffer();wb.write(httpServletResponse.getOutputStream());wb.close();}/*** excel以⽂件的形式导出* @throws Exception*/public static void exportExcelByFile(HSSFWorkbook wb,String fileName,String path) throws Exception{ByteArrayOutputStream stream = new ByteArrayOutputStream();wb.write(stream);FileOutputStream outputStream = new FileOutputStream(path + fileName);outputStream.write(stream.toByteArray());stream.close();outputStream.close();}java查询数据导出excel并返回给浏览器下载效果图:1.点击导出表按钮2.接着就会出现下图3.点击上图中的确定按钮再接着就会出现下图4.点击上图中的保存按钮接着就会出现下图,浏览器下载完成后的提⽰5.打开下载好的⽂件如下图好了,废话不多少,上代码jsp前端代码<div style="height:30px;"><a>时间:</a><input id="startDateConsume" type="text" class="easyui-datebox"> <a>-</a><input id="endDateConsume" type="text" class="easyui-datebox"><a>消费类型:</a><select id="consumesType" name=""><option value="0" selected="selected">所有</option><option value="1">报名费</option><option value="2">酒⽔零⾷类</option></select><a>⽀付状态:</a><select id="conPaymentStatus" name=""><option value="0" selected="selected">所有</option><option value="1">未⽀付</option><option value="2">已⽀付</option></select><a id="btnConsumesSearch" class="easyui-linkbutton"data-options="iconCls:'icon-search'" style="margin-left:10px">查询</a><a>(查询出来的数据可统计)</a><a id="consumesOutExcel" class="easyui-linkbutton" style="" data-options="iconCls:'icon-redo'">导出表</a></div>js前端代码$(function() {//导出excel表$('#consumesOutExcel').on('click',function(){exportExcel();});});function exportExcel() {$.messager.confirm('确认', '确认把该搜索结果导出Excel表格?', function(r) {if (r) {var startTime = $('#startDateConsume').val();var endTime = $('#endDateConsume').val();var consumesType = $('#consumesType').val();var conPaymentStatus = $('#conPaymentStatus').val();$.messager.progress({title : '处理中',msg : '请稍后',});$.messager.progress('close');location.href="web/vip/exportExcel.xlsx?startTime=" rel="external nofollow" +startTime+"&endTime="+endTime+"&consumesType="+consumesType+"&conPaymentStatus="+conPaymentStatus; }});}java后端代码@Controller@RequestMapping("/vip")public class VipController {//⽂件下载:导出excel表@RequestMapping(value = "/exportExcel.xlsx",method = RequestMethod.GET)@ResponseBodypublic void exportExcel(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException{//⼀、从后台拿数据if (null == request || null == response){return;}List<VipConsumes> list = null;String startTime = request.getParameter("startTime");String endTime = request.getParameter("endTime");int consumesType = Integer.parseInt(request.getParameter("consumesType"));int conPaymentStatus =Integer.parseInt(request.getParameter("conPaymentStatus"));VipConsumesExample example = new VipConsumesExample();if(consumesType!=0 && conPaymentStatus!=0){example.createCriteria().andTimeBetween(startTime, endTime).andConsumeTypeEqualTo(consumesType).andStatusEqualTo(conPaymentStatus);}else if(consumesType ==0 && conPaymentStatus!=0) {example.createCriteria().andTimeBetween(startTime, endTime).andStatusEqualTo(conPaymentStatus);}else if(consumesType!=0 && conPaymentStatus==0){example.createCriteria().andTimeBetween(startTime, endTime).andConsumeTypeEqualTo(consumesType);}else {example.createCriteria().andTimeBetween(startTime, endTime);}list = this.vipConsumesDao.selectByExample(example);//⼆、数据转成excelrequest.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");response.setContentType("application/x-download");String fileName = "消费记录.xlsx";fileName = URLEncoder.encode(fileName, "UTF-8");response.addHeader("Content-Disposition", "attachment;filename=" + fileName); // 第⼀步:定义⼀个新的⼯作簿XSSFWorkbook wb = new XSSFWorkbook();// 第⼆步:创建⼀个Sheet页XSSFSheet sheet = wb.createSheet("startTimeendTime");sheet.setDefaultRowHeight((short) (2 * 256));//设置⾏⾼sheet.setColumnWidth(0, 4000);//设置列宽sheet.setColumnWidth(1,5500);sheet.setColumnWidth(2,5500);sheet.setColumnWidth(3,5500);sheet.setColumnWidth(11,3000);sheet.setColumnWidth(12,3000);sheet.setColumnWidth(13,3000);XSSFFont font = wb.createFont();font.setFontName("宋体");font.setFontHeightInPoints((short) 16);XSSFRow row = sheet.createRow(0);XSSFCell cell = row.createCell(0);cell.setCellValue("流⽔号 ");cell = row.createCell(1);cell.setCellValue("微信名 ");cell = row.createCell(2);cell.setCellValue("微信订单号");cell = row.createCell(3);cell.setCellValue("消费时间");cell = row.createCell(4);cell.setCellValue("消费类型");cell = row.createCell(5);cell.setCellValue("剩余积分 ");cell = row.createCell(6);cell.setCellValue("新增积分 ");cell = row.createCell(7);cell.setCellValue("扣除积分 ");cell = row.createCell(8);cell.setCellValue("消费⾦额");cell = row.createCell(9);cell.setCellValue("⽀付⽅式");cell = row.createCell(10);cell.setCellValue("⽀付状态 ");cell = row.createCell(11);cell.setCellValue("钱包原始⾦额");cell = row.createCell(12);cell.setCellValue("钱包扣除⾦额");cell = row.createCell(13);cell.setCellValue("钱包剩余⾦额");XSSFRow rows;XSSFCell cells;for (int i = 0; i < list.size(); i++) {// 第三步:在这个sheet页⾥创建⼀⾏rows = sheet.createRow(i+1);// 第四步:在该⾏创建⼀个单元格cells = rows.createCell(0);// 第五步:在该单元格⾥设置值cells.setCellValue(list.get(i).getConsumeId());cells = rows.createCell(1);cells.setCellValue(list.get(i).getName());cells = rows.createCell(2);cells.setCellValue(list.get(i).getOrderNumber());cells = rows.createCell(3);cells.setCellValue(list.get(i).getTime());cells = rows.createCell(4);if (list.get(i).getConsumeType() == 2) {cells.setCellValue("酒⽔零⾷费");} else {cells.setCellValue("报名费");}cells = rows.createCell(5);cells.setCellValue(list.get(i).getIntegral());cells = rows.createCell(6);cells.setCellValue(list.get(i).getIntegralIn());cells = rows.createCell(7);cells.setCellValue(list.get(i).getIntegralOut());cells = rows.createCell(8);cells.setCellValue(list.get(i).getMoney());cells = rows.createCell(9);if (list.get(i).getPayment() == 2) {cells.setCellValue("积分抵现");} else if (list.get(i).getPayment() == 3) {cells.setCellValue("微信⽀付");} else if (list.get(i).getPayment() == 4) {cells.setCellValue("现⾦");} else if (list.get(i).getPayment() == 1) {cells.setCellValue("钱包");}cells = rows.createCell(10);if (list.get(i).getStatus() == 2) {cells.setCellValue("已⽀付");} else if (list.get(i).getStatus() == 1) {cells.setCellValue("未⽀付");}cells = rows.createCell(11);cells.setCellValue(list.get(i).getWalletOriginal());cells = rows.createCell(12);cells.setCellValue(list.get(i).getWalletOut());cells = rows.createCell(13);cells.setCellValue(list.get(i).getWalletSurplus());}try {OutputStream out = response.getOutputStream();wb.write(out);out.close();wb.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
Java导入导出Excel工具类ExcelUtil
![Java导入导出Excel工具类ExcelUtil](https://img.taocdn.com/s3/m/16990aef05a1b0717fd5360cba1aa81144318fd6.png)
Java导⼊导出Excel⼯具类ExcelUtil导出就是将List转化为Excel(listToExcel)导⼊就是将Excel转化为List(excelToList)导⼊导出中会出现各种各样的问题,⽐如:数据源为空、有重复⾏等,我⾃定义了⼀个ExcelException异常类,⽤来处理这些问题。
异常类导出⼯具类:public Map<String,Object> exportMessageExcelFile(String title, String[] headers,List dossierList, OutputStream out, String pattern){boolean flag = true;Map<String,Object> map = new HashMap<String,Object>();StringBuffer messageFile = new StringBuffer();// 声明⼀个⼯作薄HSSFWorkbook workbook = new HSSFWorkbook();// ⽣成⼀个表格HSSFSheet sheet = workbook.createSheet(title);// 设置表格默认列宽度为15个字节sheet.setDefaultColumnWidth((short) 15);// ⽣成⼀个样式HSSFCellStyle style = workbook.createCellStyle();style.setBorderBottom(HSSFCellStyle.BORDER_THIN);style.setBorderLeft(HSSFCellStyle.BORDER_THIN);style.setBorderRight(HSSFCellStyle.BORDER_THIN);style.setBorderTop(HSSFCellStyle.BORDER_THIN);style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//产⽣表格标题⾏HSSFRow row = sheet.createRow(0);for (short i = 0; i < headers.length; i++) {HSSFCell cell = row.createCell(i);cell.setCellStyle(style);HSSFRichTextString text = new HSSFRichTextString(headers[i]);cell.setCellValue(text);}for(int i = 0; i< dossierList.size();i++){Object[] obj = (Object[]) dossierList.get(i);row = sheet.createRow(i+1);for (int j = 0; j < obj.length; j++) {HSSFCell cell = row.createCell(j);cell.setCellStyle(style);if(j==0){cell.setCellValue(i+1);//序号}if(j==1){//Logger.debug("obj[5]"+obj[5]);cell.setCellValue(obj[5]==null?"":obj[5].toString());//办理⼈}if(j==2){//Logger.debug("obj[3]"+obj[3]);cell.setCellValue(obj[3]==null?"":obj[3].toString());//办理时间}if(j==3){// Logger.debug("obj[2]"+obj[2]);cell.setCellValue(obj[2]==null?obj[6]==null?"":obj[6].toString():obj[2].toString());//办理意见if(null!=obj[6]&&!"".equals(obj[6])){messageFile.append(obj[6].toString()+",");}break;}}}map.put("messageFile", messageFile.toString().endsWith(",")?messageFile.toString().substring(0, messageFile.toString().length()-1):messageFile.toString());try {workbook.write(out);} catch (IOException e) {e.printStackTrace();flag = false;}finally {//清理资源try {if(out != null){out.close();}} catch (IOException e) {e.printStackTrace();}}map.put("flag", flag);return map;}测试类:public static void main(String[] args) {ExportExcel<Object> ex = new ExportExcel<Object>();String[] headers = { "学号"};List<Object[]> dataset = new ArrayList<Object[]>();dataset.add(new Object[]{"1"});dataset.add(new Object[]{"2"});dataset.add(new Object[]{"3"});dataset.add(new Object[]{"4"});dataset.add(new Object[]{"5"});try {OutputStream out = new FileOutputStream("C://Users//Lenovo//Desktop/aa.xls");ex.exportMessageExcelFile("测试POI导出EXCEL⽂档", headers, dataset, out, "yyyy-MM-dd"); } catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}。
java批量导出excel格式数据(含每条数据的附件)
![java批量导出excel格式数据(含每条数据的附件)](https://img.taocdn.com/s3/m/6eb282cc7f1922791688e8ba.png)
,批量导出数据到excel中(包含每条数据对应的附件)本程序功能功能说明采用压缩的方法把用户要导出的excel 文件和excle数据中每条数据对应的文件,打包成一个大文件,输出到缓存区,用户通过浏览器来下载这个文件,缺陷是文件过大时,比如几个G大小的附件,ie下载很慢。
建议用360等支持断点续传的功能的浏览器来下载。
Excel查看附件采用的是链接方式详细如下面截图,点击文件链接,可以链接到相对文件位置的文件夹(因为附件可能是多个,采用的都是文件夹的相对链接的方式实现的),压缩包内存放的文件结构:Excel文件,reportfile(存放附件的文件夹,文件夹结构详细见代码)每行excel 都对应相对的文件夹(reportfile内的某一个子文件夹和excel的行号相对应),如下截图,红色圈圈链接的就是对应的相应文件夹下的appfile文件夹下的文件://引入的类import org.apache.tools.zip.ZipEntry;//把文件写入到压缩对象outimport org.apache.tools.zip.ZipOutputStream;import java.io.*;import java.io.OutputStream;import java.util.ArrayList;import java.util.LinkedHashMap;import java.util.List;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFFont;import ermodel.HSSFRichTextString;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import org.apache.poi.hssf.util.HSSFCellUtil;import org.apache.poi.hssf.util.HSSFColor;import org.apache.poi.hssf.util.Region;import ermodel.Font;import ermodel.HSSFHyperlink;//写入压缩的文件对象privatevoid zipfileinfo(ZipOutputStream out, File f, String base) throws Exception{//记录文件“f”对象在压缩包中的位置及压缩后的文件名称:out.putNextEntry(new ZipEntry(base));、// 写入压缩文件对象FileInputStream in = new FileInputStream(f);int b = 0;byte[] buf = newbyte[1024];while ((b = in.read(buf)) != -1){out.write(buf, 0, b);}in.close();}// 开始压缩文件privatevoid ziptmpfilelist(ZipOutputStream out, String factfielnamelist,String tmpfielnamelist) throws Exception {String[] tmpList = tmpfielnamelist.split(";");String[] fackList = factfielnamelist.split(";");for (int i = 0; i<tmpList.length; i++) {File tmpfile = new File(fackList[i]);zipfileinfo(out, tmpfile, tmpList[i].replaceAll("\\\\", "/"));}}@Overrideprotectedvoid doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// 存放文件的实际位置位置(绝对路径)String factfielnamelist="D:\\iscm\\attachdata\\2015\\0422\\FuaiFugQArVTjpG;D:\\iscm\\a ttachdata\\2015\\0422\\HIxtANutsZrwDTZ;D:\\iscm\\attachdata\\2 015\\0422\\HIxtANutsZrwDTZ";// 存放文件的位置(绝对路径)压缩时对应文件在压缩文件中的位置及名称String tmpfielnamelist = "reportfile\\tmp1\\appfile\\项目审批2.ipa;reportfile\\tmp1\\appfile\\项目审批1.doc;reportfile\\tmp1\\selffile\\app.docx";try {// 存放临时文件的目录(绝对路径)ZipOutputStream out = new ZipOutputStream(new FileOutputStream("d:\\test.zip"));response.reset();response.setContentType("application/octet-stream");response.setHeader("Content-Disposition","attachment;filename=test.zip");// 输出到缓存区方式ZipOutputStream out = newZipOutputStream(response.getOutputStream());// out.setEncoding("gbk");out.setEncoding("gb2312");//System.out.println(zipFileName);ziptmpfilelist(out, factfielnamelist, tmpfielnamelist);//输出到excel中 List<LinkedHashMap<String, Object>> result 是excel 写入的数据集合,这个需要自己重新定义.ExportExcelUtils.exportExcelAppReoort("App报备信息", headers, columns,result, "", out);out.close();} catch (Exception e) {e.printStackTrace();}}创建excel对象并写入压缩包方法/*** 控制点导出Excel的方法* @param title excel中的sheet名称* @param headers 表头* @param columns 表头对应的数据库中的列名* @param result 结果集* @param out 输出流* @param pattern 时间格式* @throws Exception*/publicstaticvoid exportExcelAppReoort(String title, String[] headers, String[] columns, List<LinkedHashMap<String, Object>> result, String filepath, ZipOutputStream out) throws Exception{//java.io.FileOutputStream out=newjava.io.FileOutputStream(filepath);// 声明一个工作薄HSSFWorkbook workbook = new HSSFWorkbook();// 生成一个表格HSSFSheet sheet = workbook.createSheet(title);// 设置表格默认列宽度为20个字节sheet.setDefaultColumnWidth(20);// 生成一个样式HSSFCellStyle style = workbook.createCellStyle();// 设置这些样式style.setFillForegroundColor(HSSFColor.GOLD.index);style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);style.setBorderBottom(HSSFCellStyle.BORDER_THIN);style.setBorderLeft(HSSFCellStyle.BORDER_THIN);style.setBorderRight(HSSFCellStyle.BORDER_THIN);style.setBorderTop(HSSFCellStyle.BORDER_THIN);style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 生成一个字体HSSFFont font = workbook.createFont();font.setColor(HSSFColor.VIOLET.index);//font.setFontHeightInPoints((short) 12);font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 把字体应用到当前的样式style.setFont(font);// 指定当单元格内容显示不下时自动换行style.setWrapText(true);// 产生表格标题行HSSFRow row1 = sheet.createRow(0);// sheet.addMergedRegion(new CellRangeAddress(1,2,3,4));//合并单元格sheet.addMergedRegion(new Region(0,(short)0,0,(short)19));row1.setHeight((short)600); //设置行高度HSSFCell cell1 = row1.createCell(0);cell1.setCellStyle(style);cell1.setCellValue(title); //"App报备信息"HSSFRow row = sheet.createRow(1);for (int i = 0; i<headers.length; i++) {HSSFCell cell = row.createCell(i);cell.setCellStyle(style);HSSFRichTextString text = new HSSFRichTextString(headers[i]); cell.setCellValue(text);}// 遍历集合数据,产生数据行if(result != null){int index = 2;for(LinkedHashMap<String, Object> m:result){row = sheet.createRow(index);int cellIndex = 0;for(String s:columns){HSSFCell cell = row.createCell(cellIndex);//cell.setCellStyle(style2);HSSFRichTextStringrichString = new HSSFRichTextString(m.get(s) == null ? "" : m.get(s).toString());if(s.equals("appAttr") || s.equals("threeSynAttr") ){//当前记录记录附件链接的文件夹位置(文件可能多个,如果一个的话,可以自己处理直接链接指向文件)String tmp=richString.toString();if (!(richString.toString().equals(""))){cell.setCellValue("文件链接");HSSFHyperlink link =new HSSFHyperlink(HSSFHyperlink.LINK_URL);link.setAddress(richString.toString());cell.setHyperlink(link);}}else{if(cellIndex==0)cell.setCellValue(Integer.valueOf(m.get(s).toString()));elsecell.setCellValue(richString);}cellIndex++;}index++;}}//写入压缩包out.putNextEntry(new ZipEntry("appReport.xls"));workbook.write(out); //写入文件}。
记一次Java导出大批量Excel优化
![记一次Java导出大批量Excel优化](https://img.taocdn.com/s3/m/a0680e36366baf1ffc4ffe4733687e21af45ffe2.png)
记⼀次Java导出⼤批量Excel优化常⽤的excel导出⽅案,详情见,其中jxl、esayEscel 底层都是基于 poi,它们仅仅是对 poi 进⾏了封装,使导出 excel 的代码更加简洁(封装poi,导出 excel 的⼯具类有很多,jxl 和 esayExcel 使⽤的⽐较多)。
所以,如果遇到 excel 导出效率低下,直接基于 poi 导出 Excel,效率肯定是最⾼的,只是代码⽐较繁琐与杂乱。
我主要是基于 esayExcel (⽬前使⽤⽐较多),对其 api 进⾏衍⽣与应⽤,解决导出⼤量 Excel 导致的 OOM,或者数据超界异常:ng.IllegalArgumentException: Invalid row number (1048576) outside allowable range (0..1048575)应⽤是基于100W条数据进⾏的测试,数据的获取代码如下1package bean;23import com.alibaba.excel.annotation.ExcelProperty;4import com.alibaba.excel.annotation.format.DateTimeFormat;5import com.alibaba.excel.annotation.format.NumberFormat;6import lombok.Data;7import lombok.experimental.Accessors;89import java.util.Date;1011/**12 * @author dz13 * @date 2021-11-06 上午 9:1414*/15 @Accessors(chain = true)16 @Data17public class ExcelBean {1819 @ExcelProperty("主键id")20private String id;2122 @ExcelProperty("姓名")23private String name;2425 @ExcelProperty("地址")26private String address;2728 @ExcelProperty("年龄")29private Integer age;3031 @ExcelProperty("数量")32private Integer number;3334 @NumberFormat("#.##")35 @ExcelProperty("⾝⾼")36private Double high;3738 @ExcelProperty("距离")39private Double distance;4041 @DateTimeFormat("yyyy-MM-dd HH:mm:ss")42 @ExcelProperty("开始时间")43private Date startTime;4445 @ExcelProperty("结束时间")46private Date endTime;47 }1/**2 * 获取excel 导出的数据3 *4 * @return list 集合5*/6private List<ExcelBean> getDate() {7 ("开始⽣成数据");8 Date date = new Date();9long startTime = System.currentTimeMillis();10 List<ExcelBean> list = Lists.newArrayList();11for (int i = 0; i < 1000000; i++) {12 ExcelBean bean = new ExcelBean();13 bean.setId(UUID.randomUUID().toString()).14 setName("隔壁⽼樊" + i).15 setAddress("北京市朝阳区酒仙桥" + i + "路").16 setAge(i).17 setNumber(i + 10000).18 setHigh(1.234 * i).19 setDistance(1.234 * i).20 setStartTime(date).21 setEndTime(date);22 list.add(bean);23 }24 ("数据⽣成结束,数据量={},耗时={}ms", list.size(), System.currentTimeMillis() - startTime);25return list;26 }pom 依赖1<dependency>2<groupId>org.projectlombok</groupId>3<artifactId>lombok</artifactId>4</dependency>5<dependency>6<groupId>com.alibaba</groupId>7<artifactId>easyexcel</artifactId>8<version>2.2.10</version>9</dependency>依赖 esayexcel 时,如果项⽬已经依赖了 poi,有可能会产⽣jar 包依赖冲突(easyexcel底层也是基于 poi),解决⽅案如下:⽅案⼀:查看 easyexcel 中依赖的 poi 的版本,然后将项⽬其余地⽅的版本修改成该版本,使项⽬依赖的 poi 版本和 easyexcel 依赖的版本⼀致⽅案⼆:在 esayexcel 中将 poi 的依赖排除掉,如下<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.10</version><exclusions><exclusion><groupId>org.apache.poi</groupId><artifactId>poi</artifactId></exclusion><exclusion><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId></exclusion><exclusion><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId></exclusion></exclusions></dependency>常量的定义1public static final String FILE_NAME = "D:\\test_" + System.currentTimeMillis() + ".xlsx";2// 每个 sheet 写⼊的数据3public static final int NUM_PER_SHEET = 300000;4// 每次向 sheet 中写⼊的数据(分页写⼊)5public static final int NUM_BY_TIMES = 50000;1.EasyExcel 导出 excel 应⽤使⽤ esayExcel ⾃带的 api 导出 excel 的应⽤,代码如下1/**2 * ⽅法⼀:将数据写⼊到excel3 * 直接调⽤api,适合⼩数据量4 * 100W条数据33s5*/6 @Test7public void writeExcelByApi() {8 String fileName = FILE_NAME;9 ("导出excel名称={}", fileName);10long startTime = System.currentTimeMillis();11// 直接调⽤api12 List<ExcelBean> date = getDate();13 EasyExcel.write(fileName, ExcelBean.class).sheet().doWrite(date);14 ("导出excel结束,数据量={},耗时={}ms", date.size(), System.currentTimeMillis() - startTime);15 }当 list 对象数据量太多,就会产⽣异常:原因是单个 excel ⼀个 sheet 的最⼤数据量为 10485751 ng.IllegalArgumentException: Invalid row number (1048576) outside allowable range (0..1048575)23 at org.apache.poi.xssf.streaming.SXSSFSheet.createRow(SXSSFSheet.java:123)4 at org.apache.poi.xssf.streaming.SXSSFSheet.createRow(SXSSFSheet.java:65)5 at com.alibaba.excel.util.WorkBookUtil.createRow(WorkBookUtil.java:70)6 at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.addOneRowOfDataToExcel(ExcelWriteAddExecutor.java:67)7 at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.add(ExcelWriteAddExecutor.java:56)8 at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:58)9 at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:161)10 at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:146)11 at com.alibaba.excel.write.builder.ExcelWriterSheetBuilder.doWrite(ExcelWriterSheetBuilder.java:61)12 at mytest.TestExcel.writeExcelByApi(TestExcel.java:40)13 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)14 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)15 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)16 at ng.reflect.Method.invoke(Method.java:498)17 at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)18 at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)19 at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)20 at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)21 at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)22 at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)23 at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)24 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)25 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)26 at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)27 at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)28 at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)29 at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)30 at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)31 at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)32 at org.junit.runners.ParentRunner.run(ParentRunner.java:413)33 at org.junit.runner.JUnitCore.run(JUnitCore.java:137)34 at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)35 at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)36 at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)37 at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)2.EasyExcel 导出 excel 应⽤优化⼀:execl 数据量超过1048575将数据写⼊到不同的 sheet,保证每个 sheet 的数据量⼩于 1048575 ⾏,解决此问题,代码如下1/**2 * ⽅法⼆:导出多个sheet3 * easyExcel 底层是 POI 实现的,POI 单个sheet 最多只能导出 1048576 ⾏,超过该⾏数,会产⽣如下异常4 * ng.IllegalArgumentException: Invalid row number (1048576) outside allowable range (0..1048575)5 * <p>6 * 11:57:55.541 [main] INFO mytest.TestExcel - 写⼊sheet=sheet0,数据量300000-0=300000,耗时=6055ms7 * 11:57:59.701 [main] INFO mytest.TestExcel - 写⼊sheet=sheet1,数据量600000-300000=300000,耗时=4159ms8 * 11:58:03.827 [main] INFO mytest.TestExcel - 写⼊sheet=sheet2,数据量900000-600000=300000,耗时=4126ms9 * 11:58:05.193 [main] INFO mytest.TestExcel - 写⼊sheet=sheet3,数据量1000000-900000=100000,耗时=1366ms10 * 11:58:17.418 [main] INFO mytest.TestExcel - 导出excel结束,总数据量=1000000,耗时=31297ms11*/12 @Test13public void writeExcelByMulSheet() {14 String fileName = FILE_NAME;15 ("导出excel名称={}", fileName);16long startTime = System.currentTimeMillis();17// 获取数据18 List<ExcelBean> date = getDate();19// 获取 sheet 的个数20int sheetNum = date.size() % NUM_PER_SHEET == 0 ? date.size() / NUM_PER_SHEET : date.size() / NUM_PER_SHEET + 1;21// 指定写⼊的⽂件22 ExcelWriter excelWriter = EasyExcel.write(fileName, ExcelBean.class).build();23for (int i = 0; i < sheetNum; i++) {24long l = System.currentTimeMillis();25// 设置 sheet 的名字(sheet不能相同)26 String sheetName = "sheet" + i;27 WriteSheet writeSheet = EasyExcel.writerSheet(i, sheetName).build();28int startNum = i * NUM_PER_SHEET;29int endNum = i == sheetNum - 1 ? date.size() : (i + 1) * NUM_PER_SHEET;30 excelWriter.write(date.subList(startNum, endNum), writeSheet);31 ("写⼊sheet={},数据量{}-{}={},耗时={}ms", sheetName, endNum, startNum, endNum - startNum, System.currentTimeMillis() - l);32 }33// 最好放在 finally中34 excelWriter.finish();35 ("导出excel结束,总数据量={},耗时={}ms", date.size(), System.currentTimeMillis() - startTime);36 }3.EasyExcel 导出 excel 应⽤优化⼆:数据源 list 太⼤,直接读取全部的 list 数据导致 OOM将 list 数据进⾏分页读取,并进⾏分页写⼊到 excel。
java多线程导入excel例子
![java多线程导入excel例子](https://img.taocdn.com/s3/m/009a1c5afe00bed5b9f3f90f76c66137ee064fd0.png)
java多线程导入excel例子Java多线程导入Excel是一种常见的数据处理任务,它可以提高程序的执行效率和并发性。
在本文中,将列举10个符合要求的Java 多线程导入Excel的例子。
1. 使用Apache POI库导入Excel文件:Apache POI是一个用于操作Microsoft Office格式文件的Java库。
可以使用POI来读取Excel文件并将数据导入到Java应用程序中。
可以使用多线程来同时处理多个Excel文件,加快导入速度。
2. 使用Java多线程并发读取Excel文件:通过创建多个线程,每个线程负责读取Excel文件的不同部分,可以同时读取多个Excel文件。
这样可以提高读取速度,特别是当需要读取大量的数据时。
3. 使用Java多线程并发写入Excel文件:与读取类似,可以使用多线程来并发写入Excel文件。
每个线程负责写入Excel文件的不同部分,可以同时写入多个Excel文件,提高写入速度。
4. 使用Java多线程并发处理Excel数据:在导入Excel数据时,可能需要对数据进行处理,例如计算、转换、过滤等。
可以使用多线程来并发处理Excel数据,加快处理速度。
5. 使用Java多线程并发导入多个Excel文件:当需要导入多个Excel文件时,可以使用多线程来同时导入多个文件。
每个线程负责导入一个文件,可以提高导入速度。
6. 使用Java多线程并发导入Excel文件夹中的所有Excel文件:如果需要导入一个文件夹中的所有Excel文件,可以使用多线程来并发导入。
每个线程负责导入一个文件,可以加快导入速度。
7. 使用Java多线程并发导入大型Excel文件:当需要导入大型Excel文件时,可以使用多线程来并发导入。
将大文件分割成多个小文件,并使用多线程同时导入这些小文件,可以提高导入速度。
8. 使用Java多线程并发导入Excel文件并实时显示进度:在导入Excel文件时,可以使用多线程来并发导入,并在界面上实时显示导入的进度。
java 使用jxl技术excel文件进行导入和导出实验用到的知识与技术
![java 使用jxl技术excel文件进行导入和导出实验用到的知识与技术](https://img.taocdn.com/s3/m/198a93525e0e7cd184254b35eefdc8d376ee14b0.png)
java 使用jxl技术excel文件进行导入和导出实验用到的知识与技术Java是一种流行的编程语言,而JXL技术是一种用于处理Excel文件的Java库。
在本文中,我们将一步一步地介绍如何使用JXL技术导入和导出Excel文件。
我们将从JXL技术的概述开始,然后讨论如何导入Excel文件,接着是如何导出Excel文件。
JXL技术是一个基于Java的开源库,用于读取、写入和操作Microsoft Excel文件。
它提供了一组API,可以方便地处理Excel文件中的单元格、行和列。
不仅可以读取现有的Excel文件,还可以创建新的Excel文件并在其中写入数据。
JXL技术支持Excel的各种版本,包括xls和xlsx格式。
接下来,我们将讨论如何导入Excel文件。
首先,我们需要在项目中引入JXL库的依赖。
在Maven项目中,我们可以将以下依赖添加到pom.xml 文件中:xml<dependency><groupId>net.sourceforge.jexcelapi</groupId><artifactId>jxl</artifactId><version>2.6.12</version></dependency>一旦我们引入了JXL依赖,我们就可以使用它的API来导入Excel文件。
首先,我们需要创建一个Workbook对象,它代表整个Excel文件。
我们可以使用Workbook类的静态方法getWorkbook()来打开一个现有的Excel文件,例如:javaWorkbook workbook = Workbook.getWorkbook(newFile("path/to/excel.xls"));在Workbook对象上,我们可以执行各种操作,例如获取特定的工作表、读取单元格的值等。
java导出Excel大数据量,自己经验总结!(二)
![java导出Excel大数据量,自己经验总结!(二)](https://img.taocdn.com/s3/m/44727c5f76232f60ddccda38376baf1ffc4fe37b.png)
java导出Excel⼤数据量,⾃⼰经验总结!(⼆)在上⼀次的基础上加上了样式,以及中⽂列名1package com.tommy.fundation.util;23import java.io.OutputStream;4import java.util.ArrayList;5import java.util.HashMap;6import java.util.Iterator;7import java.util.List;8import java.util.Map;9import java.util.Set;1011import javax.servlet.http.HttpServletResponse;1213import ermodel.HSSFWorkbook;14import ermodel.HSSFSheet;15import ermodel.HSSFCellStyle;16import ermodel.HSSFFont;17import ermodel.HSSFRow;18import ermodel.HSSFCell;19import ermodel.CellStyle;20import ermodel.Font;21import ermodel.IndexedColors;2223public class ExportExcel<T> {24public void doExcel(HttpServletResponse response, List<T> list, String fileName) throws Exception {25 String[] columnNames = new String[0];26 doExcel(response, list , columnNames, fileName);27 }28/**29 * 导出多张excel表,解决xls格式⾏数65535的限制30 * @author OnlyOne31 * @param response32 * @param list 需要处理的list数据集合33 * @param columnNames 与实体属性⼀⼀对应的列名34 * @param fileName ⽂件名35 * @throws Exception36*/37public void doExcel(HttpServletResponse response, List<T> list, String[] columnNames, String fileName) throws Exception {38 OutputStream os = response.getOutputStream();//获取输出流39 response.reset();40// 设置下载头部信息。
Java导入导出Excel工具类ExcelUtil
![Java导入导出Excel工具类ExcelUtil](https://img.taocdn.com/s3/m/68277e0ec850ad02de8041cf.png)
Java导入导出Excel工具类ExcelUtil前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出本项目的持久化层用的是JPA(底层用hibernate实现),所以导入和导出也都是基于实体类的。
在编写ExcelUtil之前,在网上查了一些资料。
java中用来处理Excel的第三方开源项目主要就是POI和JXL。
poi功能强大,但是比较耗资源,对于大数据量的导入导出性能不是太好;jxl功能简单,但是性能比较好。
由于本项目的导入导出更多关注性能问题,而且jxl提供的功能基本也都够用了,于是选择了jxl作为支持。
实战导出就是将List转化为Excel(listToExcel)导入就是将Excel转化为List(excelToList)导入导出中会出现各种各样的问题,比如:数据源为空、有重复行等,我自定义了一个ExcelException异常类,用来处理这些问题。
package common.tool.excel;public class ExcelException extends Exception {public ExcelException() {// TODO Auto-generated constructor stub}public ExcelException(String message) {super(message);// TODO Auto-generated constructor stub}public ExcelException(Throwable cause) {super(cause);// TODO Auto-generated constructor stub}public ExcelException(String message, Throwable cause) { super(message, cause);// TODO Auto-generated constructor stub}}</pre>下面就是该文的主角ExcelUtil登场了,作为一个工具类,其内的所有方法都是静态的,方便使用。
java 导出excel数据的方法
![java 导出excel数据的方法](https://img.taocdn.com/s3/m/820c702326d3240c844769eae009581b6bd9bd91.png)
java 导出excel数据的方法主题:Java 导出Excel 数据的方法引言:在开发Java应用程序时,经常需要将数据导出到Excel文件中。
Excel是一种常用的电子表格工具,可以对数据进行分析和可视化展示。
本文将介绍如何使用Java来导出Excel数据,以及实现这一功能的详细步骤。
1. 导入所需库首先,我们需要在Java项目中导入所需的库。
常用的库包括Apache POI和Apache POI-OOXML。
这些库提供了用于操作Excel 文件的类和方法。
2. 创建工作簿和工作表在Java中,我们通过HSSFWorkbook类创建一个新的Excel 工作簿。
然后,使用createSheet方法创建一个新的工作表对象。
我们可以为工作表指定名称,并将其附加到工作簿中。
3. 创建表头在工作表中,我们可以使用createRow方法创建一个新的行对象。
然后,使用createCell方法在行中创建单元格对象。
通过设置单元格的值,可以定义表头的内容。
4. 导出数据接下来,我们可以使用循环遍历数据集,并将数据写入Excel文件中。
每个数据项都可以被写入单元格对象中。
可以根据需要设置单元格的格式和样式。
5. 保存文件当所有数据都被写入Excel文件后,我们可以使用FileOutputStream类将工作簿中的数据保存到硬盘上的某个位置。
通过指定文件路径和文件名,可以将Excel文件保存在所需的位置。
6. 完整代码示例javaimport ermodel.HSSFWorkbook;import ermodel.*;import java.io.FileOutputStream;import java.util.List;public class ExcelExporter {public static void export(List<DataObject> data, String filePath) {try {Workbook workbook = new HSSFWorkbook();Sheet sheet = workbook.createSheet("Sheet 1");创建表头Row headerRow = sheet.createRow(0);Cell cell = headerRow.createCell(0);cell.setCellValue("Column 1");cell = headerRow.createCell(1);cell.setCellValue("Column 2");...导出数据int rowNum = 1;for (DataObject obj : data) {Row row = sheet.createRow(rowNum++);cell = row.createCell(0);cell.setCellValue(obj.getField1());cell = row.createCell(1);cell.setCellValue(obj.getField2());...}保存文件FileOutputStream fileOut = new FileOutputStream(filePath);workbook.write(fileOut);fileOut.close();System.out.println("Excel文件导出成功!");} catch (Exception e) {e.printStackTrace();}}}示例中,我们通过export方法将一个包含数据对象的列表导出到Excel文件中。
java通用的导出excel合并单元格格式(二)
![java通用的导出excel合并单元格格式(二)](https://img.taocdn.com/s3/m/1dc703dd77eeaeaad1f34693daef5ef7ba0d1218.png)
java通⽤的导出excel合并单元格格式(⼆)表格效果图思路:1 excel 标题头这⾥的标题写成了固定标题的第⼀列需要合并的单元格需要填充String[] head0 = new String[] { "登录名", "是否使⽤", "单位名称", "机要员", "联系⽅式", "管辖区局","级别", "作业⼈员情况", "作业⼈员情况", "作业⼈员情况", "作业⼈员情况", "作业⼈员情况","系统数据总数", "维保电梯(台)","设备数","设备数","分配情况(台)","分配情况(台)","单位地址" }; //在excel中的第2⾏每列的参数标题的第⼆列/* 在excel中的第3⾏每列(合并列)的参数这⾥需要注意的是从第⼏列合并的时候需要把前⾯不需要合并⾏的列⽤"" 补上(下表是从第7列开始合并的⾏的所以前⾯补了 6个"", 中间兼职和总数之间有⼀列是不需要合并⾏的也补了⼀个"") */String[] head1 = new String[] { " ", " ", " ", " ", " ", " ","总数", "确定", "库内", "库外", "兼职", "","总数", "认保", "认脱","分配", "未分配"};2 excel 内容通⽤⽅法写⼊从后台数据库查询到的数据到 excel后台业务逻辑(控制器从后台数据库查询数据)@RequestMapping(value = "exportMntOrgData")public void exportMntOrgData(HttpServletRequest request, HttpServletResponse response){Map<String, Object> map = new HashMap<String, Object>();Principal principal = UserUtils.getPrincipal();getManagerOrgId(map); // 判断当前登录账号是否是市局的id 如果是 supOrgId置为空查询所有// 2、导出String filename = "管理区局("+principal.getOrgname()+") 维保单位列表 .xls";List<Map<String, Object>> list = (List<Map<String, Object>>) mntOrgListStatisticsService.exportMntOrgList(map);//String path="exportTitle/mntWorker.xml";String[] head0 = new String[] { "登录名", "是否使⽤", "单位名称", "机要员", "联系⽅式", "管辖区局","级别", "作业⼈员情况", "作业⼈员情况", "作业⼈员情况", "作业⼈员情况", "作业⼈员情况","系统数据", "设备数","设备数","设备数","分配情况(台)","分配情况(台)","单位地址" };//在excel中的第2⾏每列的参数/* 在excel中的第3⾏每列(合并列)的参数这⾥需要注意的是从第⼏列合并的时候需要把前⾯不需要合并⾏的列⽤"" 补上(下表是从第7列开始合并的⾏的所以前⾯补了 6个"", 中间兼职和总数之间有⼀列是不需要合并⾏的也补了⼀个"") */String[] head1 = new String[] { "", "", "", "", "", "","总数", "确定", "库内", "库外", "兼职", "","总数", "认保", "认脱","分配", "未分配"};String[] headnum0 = new String[] { "1,2,0,0", "1,2,1,1","1,2,2,2","1,2,3,3", "1,2,4,4","1,2,5,5","1,2,6,6","1,1,7,11" , "1,2,12,12", "1,1,13,15", "1,1,16,17","1,2,18,18"};//对应excel中的⾏和列,下表从0开始{"开始⾏,结束⾏,开始列,结束列"}String[] headnum1 = new String[] { "2,2,7,7", "2,2,8,8", "2,2,9,9","2,2,10,10","2,2,11,11","2,2,13,13","2,2,14,14","2,2,15,15","2,2,16,16","2,2,17,17"};String[] colName = new String[] { "username","username","mntOrgName", "name", "mobile", "manageOrgName", "grade" ,"userTotal","userTotal" , "userTotal1", "userTotal2", "userTotal3","equTotal" , "equTotal", "mntEquCount", "notMntEquCount","assignedEquCount" , "norAssignedEquCount", "address"};//需要显⽰在excel中的参数对应的值,因为是⽤map存的,放的都是对应的key try {ExcelUtil.reportMergeXls(request, response, list, filename, head0,headnum0, head1, headnum1, colName);//utils类需要⽤到的参数} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}从后台查询 List<Map<String, Object>> 得到2条的json 格式数据如下:[ {username=邓润军,username=440225************,mntOrgName=........},{username=邓润军,username=440225************,mntOrgName=........}]通⽤的⽅法写在 ExcelUtil⾥⾯package com.nskj.utils;import java.io.BufferedReader;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.text.DecimalFormat;import java.text.SimpleDateFormat;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Scanner;import java.util.Map.Entry;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFFont;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import org.apache.poi.ss.util.CellRangeAddress;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/**** excel 导出⼯具类* @author Administrator**/public class ExcelUtil {private static DecimalFormat df = new DecimalFormat("0");// 默认单元格格式化⽇期字符串private static SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss");// 格式化数字private static DecimalFormat nf = new DecimalFormat("0.00");private final static Logger logger = LoggerFactory.getLogger(ExcelUtil.class);/**** 读取本地⽂件txt 获取excel标题* @param path* @return*/public static String getTitle(String path){FileInputStream fis = null;InputStreamReader isr = null;BufferedReader br = null; //⽤于包装InputStreamReader,提⾼处理性能。
java生成excel(多级表头)导出
![java生成excel(多级表头)导出](https://img.taocdn.com/s3/m/fcb94d6e5bcfa1c7aa00b52acfc789eb162d9e58.png)
java⽣成excel(多级表头)导出依赖⼯具包<dependencies><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.3.5</version></dependency></dependencies>该⼯具包是对 Apache POI包的分装private void export(HttpServletResponse response, String fileName, List<?> projects, List<SummarizeDownloadColumns> columns) throws IOException { ExcelWriter bigWriter = ExcelUtil.getBigWriter();//创建⼀⾏空表头占个位置bigWriter.writeHeadRow(new LinkedList());//创建需要展⽰的的⼆级表头,{filedName,中⽂名}int lastCol = 0;for (int i = 0; i < columns.size(); i++) {if (columns.get(i).getChildren() != null) {for (int j = 0; j < columns.get(i).getChildren().size(); j++) {bigWriter.addHeaderAlias(columns.get(i).getChildren().get(j).getProp(), columns.get(i).getChildren().get(j).getLabel() + columns.get(i).getProp()); bigWriter.setColumnWidth(lastCol++, 30);}}}//根据需要合并添加第⼀列表头bigWriter.merge(0, 1, 0, 0, columns.get(0).getLabel(), true);bigWriter.merge(0, 0, 1, 14, "第⼀类(个⼈)", true);bigWriter.merge(0, 0, 15, 28, "第⼀类(企业)", true);bigWriter.merge(0, 0, 29, 42, "第⼆类(个⼈)", true);bigWriter.merge(0, 0, 43, 56, "第⼆类(企业)", true);bigWriter.merge(0, 0, 57, 64, "总计项", true);// 只导出配置好的列名bigWriter.setOnlyAlias(true);bigWriter.write(projects, true);StyleSet styleSet = bigWriter.getStyleSet();styleSet.setWrapText();response.setContentType("application/vnd.ms-excel;charset=utf-8");response.setHeader("filename", URLEncoder.encode(fileName + ".xlsx", "UTF-8"));ServletOutputStream out = response.getOutputStream();bigWriter.flush(out, true);bigWriter.close();IoUtil.close(out);}导出效果动态⽣成模板(只需要表头)String fileName = "sdjhds";try {ExcelWriter bigWriter = ExcelUtil.getBigWriter();List list = new ArrayList();list.add("表头1");list.add("表头2");bigWriter.writeHeadRow(list);response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8") + ".xls");response.setHeader("filename", URLEncoder.encode(fileName, "utf-8") + ".xls");response.setHeader("Pragma", "no-cache");response.setHeader("Content-type", "application/octet-stream;charset=UTF-8");ServletOutputStream out = response.getOutputStream();bigWriter.flush(out, true);bigWriter.close();IoUtil.close(out);} catch (IOException e) {e.printStackTrace();}。
Java导出Excel统计报表合并单元格的方法详解
![Java导出Excel统计报表合并单元格的方法详解](https://img.taocdn.com/s3/m/3a5e362c0812a21614791711cc7931b765ce7b1d.png)
Java导出Excel统计报表合并单元格的⽅法详解⽬录前⾔⽰例注意事项总结前⾔Apache POI是⼀种流⾏的API,允许程序员使⽤Java程序创建,修改和显⽰MS Office⽂件。
它是由Apache Software Foundation开发和分发的开源库,⽤于使⽤Java程序设计或修改Microsoft Office⽂件。
它包含将⽤户输⼊数据或⽂件解码为MS Office⽂档的类和⽅法。
HSSF - ⽤于读取和写⼊MS-Excel⽂件的xls格式⽰例类似上⾯的需要合并表头的报表在⽇常的开发中也是经常遇到,这⾥总结下关于类似的报表开发整理。
对于这种的报表看起来很⿇烦,但其实掌握了技巧开发起来也是很简单的。
下⾯的代码仅供参考,有些字段为了脱敏都以数字显⽰了,见谅。
// 创建sheetSheet sheet = wb.createSheet("当⽉");//表头字体Font headerFont = wb.createFont();headerFont.setFontName("宋体");headerFont.setFontHeightInPoints((short) 18);headerFont.setBold(true);headerFont.setColor(Font.COLOR_NORMAL);//正⽂字体Font contextFont = wb.createFont();contextFont.setFontName("宋体");contextFont.setFontHeightInPoints((short) 12);headerFont.setBold(true);//表头样式,左右上下居中CellStyle headerStyle = wb.createCellStyle();headerStyle.setFont(headerFont);// 左右居中headerStyle.setAlignment(HorizontalAlignment.CENTER);// 上下居中headerStyle.setVerticalAlignment(VerticalAlignment.CENTER);headerStyle.setLocked(true);// ⾃动换⾏headerStyle.setWrapText(false);//单元格样式,左右上下居中边框CellStyle commonStyle = wb.createCellStyle();commonStyle.setFont(contextFont);// 左右居中commonStyle.setAlignment(HorizontalAlignment.CENTER);// 上下居中commonStyle.setVerticalAlignment(VerticalAlignment.CENTER);commonStyle.setLocked(true);// ⾃动换⾏commonStyle.setWrapText(false);//单元格样式,左右上下居中边框CellStyle commonWrapStyle = wb.createCellStyle();commonWrapStyle.setFont(contextFont);//单元格样式,竖向边框CellStyle verticalStyle = wb.createCellStyle();verticalStyle.setFont(contextFont);CellStyle commonStyleNoBorder = wb.createCellStyle();commonStyleNoBorder.setFont(contextFont);commonStyleNoBorder.setLocked(true);// ⾃动换⾏commonStyleNoBorder.setWrapText(false);CellStyle alignLeftStyle = wb.createCellStyle();alignLeftStyle.setFont(contextFont);alignLeftStyle.setLocked(true);// ⾃动换⾏alignLeftStyle.setWrapText(false);//单元格样式,左对齐⽆边框CellStyle alignLeftNoBorderStyle = wb.createCellStyle();alignLeftNoBorderStyle.setFont(contextFont);alignLeftNoBorderStyle.setLocked(true);// ⾃动换⾏alignLeftNoBorderStyle.setWrapText(false);//单元格样式,右对齐CellStyle alignRightStyle = wb.createCellStyle();alignRightStyle.setFont(contextFont);alignRightStyle.setLocked(true);// ⾃动换⾏alignRightStyle.setWrapText(false);// ⾏号int rowNum = 0;//设置列宽for (int i = 0; i < 11; i++) {sheet.setColumnWidth(i, 3000);}//第⼀⾏Row r0 = sheet.createRow(rowNum++);r0.setHeight((short) 800);Cell c00 = r0.createCell(0);c00.setCellValue("表⼆:");c00.setCellStyle(alignLeftNoBorderStyle);//合并单元格sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 8));//第⼆⾏城市对象综合统计表Row r1= sheet.createRow(rowNum++);r1.setHeight((short) 800);Cell r10 = r1.createCell(0);r10.setCellValue("城市对象管理情况统计表");r10.setCellStyle(headerStyle);//合并单元格sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 8));//第三⾏Row r2 = sheet.createRow(rowNum++);r2.setHeight((short) 800);Cell r20 = r2.createCell(0);r20.setCellValue("填表单位:XXX街道");r20.setCellStyle(alignLeftNoBorderStyle);//合并单元格sheet.addMergedRegion(new CellRangeAddress(2, 2, 0, 4));//第四⾏Row r3 = sheet.createRow(rowNum++);r3.setHeight((short) 700);String[] rowSecond = {"地区", "对象情况1", "","对象情况2","" ,"调增情况3","","情况4",""}; for (int i = 0; i < rowSecond.length; i++) {Cell tempCell = r3.createCell(i);tempCell.setCellValue(rowSecond[i]);tempCell.setCellStyle(commonStyle);}//第5⾏Row r4 = sheet.createRow(rowNum++);String[] rowSecond5 = {"1", "2", "3","4","5","6","7","8"};for (int i = 0; i < rowSecond5.length; i++) {Cell tempCell = r4.createCell(i+1);tempCell.setCellValue(rowSecond5[i]);tempCell.setCellStyle(commonStyle);}//合并单元格sheet.addMergedRegion(new CellRangeAddress(3, 4, 0, 0));sheet.addMergedRegion(new CellRangeAddress(3, 3, 1, 2));sheet.addMergedRegion(new CellRangeAddress(3, 3, 3, 4));sheet.addMergedRegion(new CellRangeAddress(3, 3, 5, 6));sheet.addMergedRegion(new CellRangeAddress(3, 3, 7, 8));//查询数据List<Map<String, Object>> dataList = XXX.list(XXX);//统计合计数据Map<String,Object> mapTotal = new HashMap<>();for (Map<String, Object> map : dataList) {Row tempRow = sheet.createRow(rowNum++);//列表数据Cell tempCell0 = tempRow.createCell(0);String sqmc = (String) map.get("XXX");tempCell0.setCellValue(sqmc);tempCell0.setCellStyle(commonStyle);}//导出response.setContentType("application/vnd.ms-excel");// ⽂件名String fileName = "报表名称.xls";response.setHeader("Content-disposition", "attachment;filename=\"" + fileName + "\""); OutputStream stream = response.getOutputStream();try {if (null != wb && null != stream) {wb.write(stream);stream.close();}} catch (Exception e) {log.error("excel⽂档导出错误-异常信息:", e);}注意事项【1】POI操作的⾏和列都是从0位置开始的【2】所有的复杂表头⽆⾮是合并单元格,这⾥都可以通过下⾯的API实现int addMergedRegion(CellRangeAddress region)添加合并的单元格区域创建新的单元格范围。
java导出excel合并单元格
![java导出excel合并单元格](https://img.taocdn.com/s3/m/04b255cd541810a6f524ccbff121dd36a32dc4b2.png)
java导出excel合并单元格@RequestMapping("exportWells")public View exportWells(Model model, HttpServletRequest request) { View view = new AbstractExcelView() {@Overrideprotected void buildExcelDocument(Map<String, Object> model,HSSFWorkbook workbook,HttpServletRequest request,HttpServletResponse response) throws Exception {// 设置response方式,使执行此controller时候自动出现下载页面,而非直接使用excel打开response.reset();response.setContentType("application/vnd.ms-excel");String filename = getFileName() + ".xls";// 注意,如果去掉下面一行代码中的attachment; 那么也会使IE自动打开文件。
response.setHeader("Content-disposition","attachment;filename=" + filename);String boardId_aod = request.getParameter("boardId_aod");Sheet // 建立HSSFSheet sheet = workbook.createSheet("sheet1");int rowNum = 0;int idx = 0;// 建立标题HSSFRow header = sheet.createRow(rowNum++);HSSFCellStyle cellStyle = workbook.createCellStyle(); HSSFCellStyle centerCellStyle =workbook.createCellStyle();centerCellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);centerCellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);centerCellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);centerCellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);centerCellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐cellStyle.setWrapText(true);cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);HSSFCellStyle boldCellStyle =workbook.createCellStyle();boldCellStyle.setWrapText(true);boldCellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);boldCellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);boldCellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);boldCellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); HSSFFont font = workbook.createFont();font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);boldCellStyle.setFont(font);header.createCell(idx++); HSSFCell cell =cell.setCellValue("纯化板号");cell.setCellStyle(cellStyle);cell = header.createCell(idx++);cell.setCellValue("订单编号");cell.setCellStyle(cellStyle);cell = header.createCell(idx++);cell.setCellValue("孔位");cell.setCellStyle(cellStyle);cell = header.createCell(idx++);cell.setCellValue("引物流水号");cell.setCellStyle(cellStyle);cell = header.createCell(idx++);cell.setCellValue("实测OD");cell.setCellStyle(cellStyle);cell = header.createCell(idx++);cell.setCellValue("ul/1OD");// 加粗cell.setCellStyle(boldCellStyle);cell = header.createCell(idx++);cell.setCellValue("总量"); cell.setCellStyle(cellStyle);cell = header.createCell(idx++);cell.setCellValue("分装");cell.setCellStyle(cellStyle);cell = header.createCell(idx++);cell.setCellValue("用户孔位");cell.setCellStyle(cellStyle);cell = header.createCell(idx++);cell.setCellValue("跟单标志");cell.setCellStyle(cellStyle);cell = header.createCell(idx++);cell.setCellValue("打回次数"); cell.setCellStyle(cellStyle);sheet.setColumnWidth(0, 3066); sheet.setColumnWidth(1, 3966); sheet.setColumnWidth(2, 1200); sheet.setColumnWidth(3, 3766); sheet.setColumnWidth(4, 1266); sheet.setColumnWidth(5, 1266); sheet.setColumnWidth(6, 1266); sheet.setColumnWidth(7, 1266);sheet.setColumnWidth(8, 1266); sheet.setColumnWidth(9, 1266); sheet.setColumnWidth(10, 1266);// 输出内容List<Well> wells = crudeOdService.findWellsByBoardId(boardId_aod);String orderNumber = "";int mergecount = 0;int firstMergeRow = 1;boolean canMerge = false;HSSFRow row;for (Well p : wells) {idx = 0;row = sheet.createRow(rowNum++);cell = row.createCell(idx++);cell.setCellValue(p.getBoardNumber());cell.setCellStyle(cellStyle);cell = row.createCell(idx++);cell.setCellValue(p.getOrderNumber());if (orderNumber.equals(p.getOrderNumber())) {mergecount++;if (rowNum == wells.size() + 1 && canMerge == false) {sheet.addMergedRegion(new Region(1, (short) 1,mergecount + 1, (short) 1));}if (rowNum == wells.size() + 1 && canMerge == true) { sheet.addMergedRegion(new Region(rowNum - 1- mergecount, (short) 1, rowNum - 1,(short) 1));}} else {if (rowNum != wells.size() + 1) { orderNumber =p.getOrderNumber();(rowNum != 2) { ifcanMerge = true;sheet.addMergedRegion(new Region(firstMergeRow,(short) 1, firstMergeRow + mergecount,(short) 1)); }mergecount = 0;firstMergeRow = rowNum - 1;}}cell.setCellStyle(centerCellStyle);cell = row.createCell(idx++);cell.setCellValue(p.getWells());cell.setCellStyle(cellStyle);cell = row.createCell(idx++);cell.setCellValue(p.getPrimerNo());cell.setCellStyle(cellStyle);cell = row.createCell(idx++);cell.setCellValue(p.getOdValue());cell.setCellStyle(cellStyle);// 加粗cell = row.createCell(idx++);cell.setCellValue(p.getUL10D());cell.setCellStyle(boldCellStyle);cell = row.createCell(idx++);cell.setCellValue(p.getTotal());cell.setCellStyle(cellStyle);cell = row.createCell(idx++);cell.setCellValue(p.getSplitN());cell.setCellStyle(cellStyle);cell = row.createCell(idx++);cell.setCellValue(p.getCustomerWell());cell.setCellStyle(cellStyle);cell = row.createCell(idx++);cell.setCellValue(p.getFollowOrderFlag()); cell.setCellStyle(cellStyle);cell = row.createCell(idx++);cell.setCellValue(p.getPushBackCount()); cell.setCellStyle(cellStyle);}}};return view; }。
Java:导出Excel大批量数据的优化过程
![Java:导出Excel大批量数据的优化过程](https://img.taocdn.com/s3/m/0ff45f51bf1e650e52ea551810a6f524cdbfcb56.png)
Java:导出Excel⼤批量数据的优化过程背景团队⽬前在做⼀个⽤户数据看板(下⾯简称看板),基本覆盖⽤户的所有⾏为数据,并⽣成分析报表,⽤户⾏为由多个数据来源组成(餐饮、⽣活⽇⽤、充值消费、交通出⾏、通讯物流、交通出⾏、医疗保健、住房物业、运动健康...),基于⼤量数据的组合、排序和统计。
根据最新的统计报告,每天将近100W+的⾏为数据产⽣,所以这个数据基数是⾮常⼤的。
⽽这个数据中⼼,对接很多的业务团队,这些团队根据⾃⼰的需要,对某些维度进⾏筛选,然后直接从我们的中⼼上下载数据(excel)⽂档进⾏分析。
所以下个⼏⼗万上百万⾏的数据是很常见的。
问题和解决⽅案遇到的问题⽬前遇到的主要问题是,随着⾏为能⼒逐渐的完善闭环,⽤户数据沉淀的也越来越多了,同时业务量的也在不断扩⼤。
业务团队有时候会下载超量的数据来进⾏分析,平台上的数据下载能⼒就显得尤为重要了。
⽽我们的问题是下载效率太慢,10W的数据⼤约要5分钟以上才能下载下来,这显然有问题了。
解决步骤代码是之前团队遗留的,原先功能没开放使⽤,没有数据量,所以没有发现问题。
以下是原来的导出模块,原程序如下,我做了基本还原。
现在如何保证数据的⾼效导出是我们最重要的⽬标,这个也是业务团队最关⼼的。
1/**2 * 获取导出的Excel的⽂件流信息3 * @param exportData4 * @return5 * @throws Exception6*/7private OutputStream getExportOutPutStream(List<UBehavDto> exportData) throws Exception {8 JSONObject object = new JSONObject();9 List<ExcelCell[]> excelCells = new ArrayList<>();10 String[] headers = new String[] { "A字段","B字段","C字段","D","E","F","G","H","I","J","K","L",11 "M","N","O","P","Q","R","S","T","U","V","W",12 "X","Y","Z","AA","AB","AC","AD","AE字段","AF字段","AG字段" };13 ExcelCell[] headerRow = getHeaderRow(headers);14 excelCells.add(headerRow);15 String pattern = "yyyy-MM-dd hh:mm:ss";16for (UBehavDto uBehavDto:exportData) {17 String[] singleRow = new String[] { uBehavDto.getA(),uBehavDto.getB(),uBehavDto.getC(),uBehavDto.getD(),uBehavDto.getE(),uBehavDto.getF(),18 DateFormatUtils.format(uBehavDto.getAddTime(), pattern),DateFormatUtils.format(uBehavDto.getDate(), pattern),19 uBehavDto.getG(),uBehavDto.getH(),uBehavDto.getI(),uBehavDto.getJ(),uBehavDto.getK(),uBehavDto.getL(),uBehavDto.getM(),20 uBehavDto.getN(),uBehavDto.getO(),uBehavDto.getP(),21 uBehavDto.getQ(),uBehavDto.getR(),uBehavDto.getS(),String.valueOf(uBehavDto.getT()),uBehavDto.getMemo(),uBehavDto.getU(),uBehavDto.getV(),22 uBehavDto.getW(),uBehavDto.getX(),23 uBehavDto.getY(),uBehavDto.getZ(),uBehavDto.getAA(),uBehavDto.getAB(),uBehavDto.getAC() };24 ExcelCell[] cells = new ExcelCell[singleRow.length];25 ExcelCell getA=new ExcelCell();getA.setValue(uBehavDto.getA());26 ExcelCell getB=new ExcelCell();getB.setValue(uBehavDto.getB());27 ExcelCell getC=new ExcelCell();getC.setValue(uBehavDto.getC());28 ExcelCell getD=new ExcelCell();getD.setValue(uBehavDto.getD());29 ExcelCell getE=new ExcelCell();getE.setValue(uBehavDto.getE());30 ExcelCell getF=new ExcelCell();getF.setValue(uBehavDto.getF());31 ExcelCell getAddTime=new ExcelCell();getAddTime.setValue(DateFormatUtils.format(uBehavDto.getAddTime(), pattern));32 ExcelCell getDate=new ExcelCell();getDate.setValue(DateFormatUtils.format(uBehavDto.getDate(), pattern));33 ExcelCell getG=new ExcelCell();getG.setValue(uBehavDto.getG());34 ExcelCell getH=new ExcelCell();getH.setValue(uBehavDto.getH());35 ExcelCell getI=new ExcelCell();getI.setValue(uBehavDto.getI());36 ExcelCell getJ=new ExcelCell();getJ.setValue(uBehavDto.getJ());37 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getK());38 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getL());39 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getM());40 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getN());41 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getO());42 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getP());43 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getQ());44 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getR());45 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getS());46 ExcelCell a=new ExcelCell();a.setValue(String.valueOf(uBehavDto.getT()));47 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getMemo());48 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getU());49 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getV());50 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getW());51 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getX());52 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getY());53 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getZ());54 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getAA());55 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getAB());56 ExcelCell a=new ExcelCell();a.setValue(uBehavDto.getAC());57 ExcelCell[] cells = {58new ExcelCell(uBehavDto.getA()),59new ExcelCell().setValue(uBehavDto.getB()),60new ExcelCell().setValue(uBehavDto.getC()),61new ExcelCell().setValue(uBehavDto.getD()),62new ExcelCell().setValue(uBehavDto.getE()),63new ExcelCell().setValue(uBehavDto.getF()),64new ExcelCell().setValue(DateFormatUtils.format(uBehavDto.getAddTime(), pattern)),65new ExcelCell().setValue(DateFormatUtils.format(uBehavDto.getDate(), pattern)),66new ExcelCell().setValue(uBehavDto.getG()),67new ExcelCell().setValue(uBehavDto.getH()),68new ExcelCell().setValue(uBehavDto.getI()),69new ExcelCell().setValue(uBehavDto.getJ()),70new ExcelCell().setValue(uBehavDto.getK()),71new ExcelCell().setValue(uBehavDto.getL()),72new ExcelCell().setValue(uBehavDto.getM()),73new ExcelCell().setValue(uBehavDto.getN()),74new ExcelCell().setValue(uBehavDto.getO()),75new ExcelCell().setValue(uBehavDto.getP()),76new ExcelCell().setValue(uBehavDto.getQ()),77new ExcelCell().setValue(uBehavDto.getR()),78new ExcelCell().setValue(uBehavDto.getS()),79new ExcelCell().setValue(String.valueOf(uBehavDto.getT())),80new ExcelCell().setValue(uBehavDto.getMemo()),81new ExcelCell().setValue(uBehavDto.getU()),82new ExcelCell().setValue(uBehavDto.getV()),83new ExcelCell().setValue(uBehavDto.getW()),84new ExcelCell().setValue(uBehavDto.getX()),85new ExcelCell().setValue(uBehavDto.getY()),86new ExcelCell().setValue(uBehavDto.getZ()),87new ExcelCell().setValue(uBehavDto.getAA()),88new ExcelCell().setValue(uBehavDto.getAB()),89new ExcelCell().setValue(uBehavDto.getAC())90 };9192for(int idx=0;idx<singleRow.length;idx++) {93 ExcelCell cell = new ExcelCell();94 cell.setValue(singleRow[idx]);95 cells[idx] = cell;96 }97 excelCells.add(cells);98 }99 object.put("⾏为数据", excelCells);100 ExcelUtils utils = new ExcelUtils();101 OutputStream outputStream = utils.writeExcel(object);102return outputStream;103 }看看标红的代码,这个⽣成Excel的⽅式是对Excel中的每⼀个cell进⾏渲染,逐⾏的进⾏数据填充,效率太慢了,根据⽇志分析发现:基本时间都耗费在数据⽣成Excel上。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sheetAct=createExcelHead(sheetAct,writer,excelHead,title+num);}list=agentService.queryExportData(map);if(j<5){findExcelData(j*limit,list,sheetAct);}else{int num=j/5;findExcelData((j-num*5)*limit,list,sheetAct);}}writer.write();}catch(Exception e){LOGGER.error("Exception:", e.fillInStackTrace());}finally {if (null != writer) {writer.close();}}return out.toByteArray();}findExcelData 方法:private void findExcelData(int start,List<StudioSeriesPrice> list,ExcelWriter.Sheet sheetAct){StudioSeriesPrice detail=null;/*拼装excel内容*/for(int i=0;i<list.size();i++){detail=list.get(i);sheetAct.getOrCreateCell((start+i + 1), 0).setCellStyle(sheetAct.addStyle());sheetAct.getOrCreateCell((start+i + 1), 0).setCellValue(detail.getCompany());sheetAct.getOrCreateCell((start+i + 1), 1).setCellStyle(sheetAct.addStyle());sheetAct.getOrCreateCell((start+i + 1), 1).setCellValue(detail.getCreatetime());sheetAct.getOrCreateCell((start+i + 1), 2).setCellStyle(sheetAct.addStyle());sheetAct.getOrCreateCell((start+i + 1), 2).setCellValue(detail.getPrice());sheetAct.getOrCreateCell((start+i + 1), 3).setCellStyle(sheetAct.addStyle());sheetAct.getOrCreateCell((start+i + 1),3).setCellValue(detail.getNum());sheetAct.getOrCreateCell((start+i + 1), 4).setCellStyle(sheetAct.addStyle());sheetAct.getOrCreateCell((start+i + 1), 4).setCellValue(detail.getTypename());sheetAct.getOrCreateCell((start+i + 1), 5).setCellStyle(sheetAct.addStyle());sheetAct.getOrCreateCell((start+i + 1), 5).setCellValue(detail.getAgentName());sheetAct.getOrCreateCell((start+i + 1), 6).setCellStyle(sheetAct.addStyle());sheetAct.getOrCreateCell((start+i + 1), 6).setCellValue(detail.getPricename());}}/**** @param sheetAct* @param writer* @param excelHead* @param title* @return*/private ExcelWriter.Sheet createExcelHead( ExcelWriter.Sheet sheetAct,ExcelWriter writer,String [] excelHead,String title){ sheetAct = writer.getOrCreateSheet(title);/*拼装excel头部*/for(int i=0;i<excelHead.length;i++){sheetAct.getOrCreateCell(0,i).setCellStyle(sheetAct.addStyle());sheetAct.setColumnWidth(i, 6000);sheetAct.getOrCreateCell(0,i).setCellValue(excelHead[i]);}return sheetAct;}帮助类:package com.kerui.utils;import java.io.IOException;import java.io.OutputStream;import java.util.Date;import java.util.HashMap;import java.util.Map;import mons.io.IOUtils;import ermodel.HSSFCellStyle;import ermodel.CellStyle;import ermodel.DataFormat;import ermodel.Row;import ermodel.Workbook;import org.apache.poi.ss.util.CellRangeAddress;import ermodel.XSSFWorkbook;public final class ExcelWriter {public static final class Cell {private Workbook wb;private ermodel.Cell target;private Cell(Workbook wb, ermodel.Cell cell) {this.wb = wb;this.target = cell;}public void setCellValue(String value) {this.target.setCellValue(value);}public void setCellValue(Date value) {if (null == value) {this.setCellValue("未设置");return;}CellStyle style = this.wb.createCellStyle();DataFormat format = wb.createDataFormat();style.setDataFormat(format.getFormat("yyyy/m/dhh:mm:ss"));this.target.setCellStyle(style);this.target.setCellValue(value);}public void setCellValue(double value) {CellStyle style = this.wb.createCellStyle();DataFormat format = wb.createDataFormat();style.setDataFormat(format.getFormat("###,##0"));this.target.setCellStyle(style);this.target.setCellValue(value);}public void setCellStyle(CellStyle style){this.target.setCellStyle(style);}}public static final class Sheet{private Workbook wb;private ermodel.Sheet sheet;private Sheet(Workbook wb, ermodel.Sheet sheet) {this.sheet = sheet;this.wb = wb;}public void setColumnWidth(int column, int width){sheet.setColumnWidth(column, width);}public Cell getOrCreateCell(int rowBasedZero, int cellBasedZero) {Row row = this.sheet.getRow(rowBasedZero);if (null == row) {row = this.sheet.createRow(rowBasedZero);}return new Cell(this.wb, row.getCell(cellBasedZero, Row.CREATE_NULL_AS_BLANK));}//合并单元格public void mergedRegion(int intFirstRow, int intLastRow, int intFirstColumn, int intLastColumn){this.sheet.addMergedRegion(newCellRangeAddress(intFirstRow, intLastRow, intFirstColumn, intLastColumn));}//添加居中的样式public CellStyle addStyle(){CellStyle style = wb.createCellStyle();style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平return style;}}private Map<String, Sheet> sheetMap= new HashMap<String, Sheet>();private OutputStream out;private Workbook wb;public ExcelWriter(OutputStream out) {this.out = out;wb = new XSSFWorkbook();}public Sheet getOrCreateSheet(String sheet) {Sheet sheet1 = this.sheetMap.get(sheet);if (null != sheet1) {return sheet1;}ermodel.Sheet xlsSheet = this.wb.getSheet(sheet);if (null == xlsSheet) {xlsSheet = this.wb.createSheet(sheet);}Sheet obj = new Sheet(this.wb, xlsSheet);this.sheetMap.put(sheet, obj);return obj;}public void write() throws IOException {this.wb.write(this.out);}public void close() {this.sheetMap.clear();IOUtils.closeQuietly(this.out);}}。