java实现excel导入导出
- 格式:doc
- 大小:110.00 KB
- 文档页数:48
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表导⼊导出功能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";}最后即可获取新的测试结果表格。
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,可以到下载。
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导⼊导出以及excel样式设置JAVA实现Excel导⼊/导出以及excel样式设置图2.1 POI的⽬录结构 POI使⽤初步 POI提供给⽤户使⽤的对象在ermodel包中,主要部分包括Excel对象、样式和格式,还有辅助操作等。
最主要的⼏个对象如表3.1所⽰: 表3.1 POI主要对象POI对象名称对应的Excel对象HSSFWorkbook⼯作簿HSSFSheet⼯作表HSSFRow⾏HSSFCell单元格 下⾯我们来看如下的例⼦,使⽤表3.1中的对象在程序的当前⽬录下创建⼀个Excel⽂件test.xls,在第⼀个单元格中写⼊内容,然后读出第⼀个单元格的内容。
完整的程序如下:import ermodel.HSSFWorkbook;import ermodel.HSSFSheet;import ermodel.HSSFRow;import ermodel.HSSFCell;import java.io.FileOutputStream;import java.io.FileInputStream;public class CreateXL{ public static String xlsFile="test.xls"; //产⽣的Excel⽂件的名称 public static void main(String args[]) { try { HSSFWorkbook workbook = new HSSFWorkbook(); //产⽣⼯作簿对象 HSSFSheet sheet = workbook.createSheet(); //产⽣⼯作表对象 //设置第⼀个⼯作表的名称为firstSheet //为了⼯作表能⽀持中⽂,设置字符编码为UTF_16 workbook.setSheetName(0,"firstSheet",HSSFWorkbook.ENCODING_UTF_16); //产⽣⼀⾏ HSSFRow row = sheet.createRow((short)0); //产⽣第⼀个单元格 HSSFCell cell = row.createCell((short) 0); //设置单元格内容为字符串型 cell.setCellType(HSSFCell.CELL_TYPE_STRING); //为了能在单元格中写⼊中⽂,设置字符编码为UTF_16。
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();}}。
hutool工具类实现的简易excel文件导出方法一、前言Excel文件作为数据存储和交换的重要工具,在各种场景下都有着广泛的应用。
然而,对于一些非专业的开发者来说,手动编写Excel 文件的导出功能可能会显得有些复杂。
为此,我们介绍一种使用hutool工具类实现的简易Excel文件导出方法。
二、hutool工具类介绍hutool是一组Java工具类的集合,提供了大量实用的功能,如文件操作、网络操作、日期时间处理等。
它具有简洁、高效、易用的特点,为开发者提供了很大的便利。
三、Excel文件导出步骤1.导入hutool库首先,需要在项目中导入hutool库,以便使用其中的功能。
可以通过Maven或Gradle等方式将其添加到项目依赖中。
2.创建Excel文件使用hutool提供的ExcelWriter类,可以很方便地创建一个Excel文件。
3.写入数据使用ExcelWriter类的write方法,可以将数据写入到Excel文件中。
支持写入各种类型的数据,如字符串、数字、日期等。
4.保存Excel文件完成数据写入后,需要调用ExcelWriter类的close方法来保存Excel文件。
四、示例代码以下是一个简单的示例代码,演示了如何使用hutool工具类实现Excel文件的导出:```javaimportcn.hutool.core.io.FileUtil;importcn.hutool.core.util.ExcelUtil;importcn.hutool.core.util.StrUtil;importjava.io.File;importjava.util.ArrayList;importjava.util.List;publicclassExcelExporter{publicstaticvoidmain(String[]args){//创建Excel文件StringfileName="example.xlsx";Filefile=FileUtil.getSingleFile(fileName);ExcelWriterwriter=newExcelWriter(file);//写入数据List<String>data1=newArrayList<>();data1.add("姓名");data1.add("年龄");writer.write(StrUtil.repeatCell("数据1",2));//写入标题行writer.write(data1);//写入数据行List<String>data2=newArrayList<>();data2.add("张三");data2.add("25");writer.write(data2);//写入数据行//关闭Excel文件writer.close();}}```五、总结使用hutool工具类实现Excel文件的导出,可以简化开发过程,提高效率。
通过Excel批量导⼊数据-Java代码1. 依赖<!-- excel导出 start--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.16</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.16</version></dependency><!-- excel导出 end-->2. 导⼊⼯具类/*** 将 Excel内容转为List** @param file 上传的Excel⽂件* @param name Excel表格中第⼀个sheet的名字* @return对应的map集合**/public static List<Map<String, Object>> excelToList(MultipartFile file, String name) throws Exception {Workbook workbook = WorkbookFactory.create(file.getInputStream());Sheet sheet = workbook.getSheet(name);//⾏数int num = sheet.getLastRowNum();//列数int col = sheet.getRow(0).getLastCellNum();List<Map<String, Object>> list = new ArrayList<>();String[] colName = new String[col];//获取列名Row row = sheet.getRow(0);for (int i = 0; i < col; i++) {String[] s = row.getCell(i).getStringCellValue().split("-");colName[i] = s[0];}//将⼀⾏中每列数据放⼊⼀个map中,然后把map放⼊listfor (int i = 1; i <= num; i++) {Map<String, Object> map = new HashMap<>();Row row1 = sheet.getRow(i);if (row1 != null) {for (int j = 0; j < col; j++) {Cell cell = row1.getCell(j);if (cell != null) {cell.setCellType(Cell.CELL_TYPE_STRING);map.put(colName[j], cell.getStringCellValue());}}}list.add(map);}return list;}3. 导⼊业务代码public void importExcel(MultipartFile file) {try {List<Map<String, Object>> importList = ExcelUtil.excelToList(file, "Sheet1");List<User> list = getUserList(importList);int flag = 0;List<User> userList = new ArrayList<>(16);for (User u : list) {userList.add(h);flag++;if (0 == flag % 500 || flag == list.size()) {UserDao.addBatchUser(userList);userList.clear();("执⾏前 {} 条成功", flag);}}} catch (Exception e) {("导⼊Excel失败");e.printStackTrace();}}private List<User> getUserList(List<Map<String, Object>> importList) {List<User> list = new ArrayList<>(16);importList.forEach(e -> {User user = new User();if (Objects.nonNull(e.get("姓名"))) {user.setUsername(e.get("姓名").toString());}if (Objects.nonNull(e.get("年龄"))) {user.setAge(e.get("年龄").toString());}if (Objects.nonNull(e.get("⼿机号"))) {user.setPhone(e.get("⼿机号").toString());}list.add(user);});return list;}========================================================================================== 1. 导出Excel⼯具类/*** 导出 excel** @param response 响应下载* @param name ⽂件名字* @param list 导出的数据list* @return**/public static void exportToExcel(HttpServletResponse response, String name, List<LinkedHashMap<String, Object>> list) {try {//⽂件名称String fileName = name + ".xls";HSSFWorkbook hssfWorkbook = new HSSFWorkbook();HSSFSheet hssfSheet = hssfWorkbook.createSheet(name);int rowNum = 0;//新建⾏HSSFRow hssfRow = hssfSheet.createRow(rowNum++);//列int j = 0;if (list.size() > 0) {for (String i : list.get(0).keySet()) {//新建第⼀⾏hssfRow.createCell(j++).setCellValue(i);}//将数据放⼊表中for (int i = 0; i < list.size(); i++) {//新建⼀⾏HSSFRow row = hssfSheet.createRow(rowNum++);Map map = list.get(i);System.out.println(map);j = 0;for (Object obj : map.values()) {if (obj != null) {row.createCell(j++).setCellValue(obj.toString());} else {row.createCell(j++);}}}}// 告诉浏览器⽤什么软件可以打开此⽂件response.setHeader("content-Type", "application/vnd.ms-excel");// 下载⽂件的默认名称response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));hssfWorkbook.write(response.getOutputStream());} catch (Exception e) {e.printStackTrace();}}2. 导出业务代码public void exportExcel(HttpServletResponse response, String name) {List<LinkedHashMap<String, Object>> list = new ArrayList<>(16);UserDto userDto = new UserDto(18);//设置导出哪些数据List<User> userList = userDao.selectByCon(userDto);userList.forEach(e->{ LinkedHashMap<String, Object> map = new LinkedHashMap<>(16);map.put("姓名",e.getUsername());map.put("年龄",e.getAge());map.put("⼿机号",e.getPhone());list.add(map);});ExcelUtil.exportToExcel(response,name,list);}3. 可以在浏览器访问接⼝,直接下载,也可以调⽤postman->send and download请求下载。
java实现导出Excel(跨⾏,跨列)先来个最终结果样式:第⼀步:传参,后期可根据⾃⼰需要进⾏调整。
我这⾥需要的是quarter 代表季度dptid 部门编号根据接受过来的参数进⾏⽂档命名。
UserInfo userInfo=(UserInfo)request.getSession().getAttribute("userInfo");String userid=userInfo.getUserID();String quarter = request.getParameter("quarter");String dptid = request.getParameter("dptid");/***********************EXCEL导出部分**************************/String str3 = FileInfoTools.getSystemFilePath()+ "/documentTemp/";File file = new File(str3);if (!file.exists() && !file.isDirectory()) {file.mkdir();}String names = new SimpleDateFormat("yyyyMMddhhmmssSSS").format(new Date());String ourl = str3 + names + "_"+userid+".xls";FileOutputStream fos = null;String fileName = "";try {HSSFWorkbook wb = new HSSFWorkbook();//创建⼯作薄fileName = "安全可控导出"+"_"+userid+"_"+names+".xls";DBManager dbm = new DBManager();System.out.println("quarter+"+quarter+"dptid="+dptid);try{dbm.newConnection();String str = "select departmentname from dpt_department where departmentid='"+dptid+"'"; //获取唯⼀idString dptName = dbm.executeQueryString(str);fileName=dptName+"部门安全可控清单汇总"+"_"+userid+"_"+names+".xls";//创建sheet页,并写⼊内容createSheet(dbm,wb,getCardInfo(dbm,quarter,dptid));}catch(Exception e){e.printStackTrace();}finally{dbm.closeConnection();}File ff = new File(ourl);if (ff.exists()) {ff.delete();}fos = new FileOutputStream(ourl);wb.write(fos);fos.close();String u = "/project/system/fileAction.do?filePath=" + URLEncoder.encode(ourl)+ "&fileName=" + URLEncoder.encode(fileName);response.sendRedirect(u);} catch (Exception e) {e.printStackTrace();}第⼆步:创建sheet页签public void createSheet(DBManager dbm,HSSFWorkbook w,Vector vt) throws Exception{for(int i=0;i<vt.size();i++){Hashtable ht = (Hashtable)vt.get(i);String id = (String)ht.get("id");String quarter = (String)ht.get("quarter");HSSFSheet sheet = w.createSheet("安全可控清单");//写⼊数据wirteSheet(dbm,sheet,w,id,quarter);}}我这⾥页签是固定的名称可根据⾃⼰的需要根据参数来进⾏判断页签。
产品需求产品经理需要导出一个页面的所有的信息到 EXCEL 文件。
需求分析对于 excel 导出,是一个很常见的需求。
最常见的解决方案就是使用 poi 直接同步导出一个 excel 文件。
客户体验 & 服务性能•客户体验如果导出的文件比较大,比如几十万条数据,同步导出页面就会卡主,用户无法进行其他操作。
•服务性能导出的时候,任务比较耗时就会阻塞主线程。
如果导出的服务是暴露给外部(前后端分离),这种大量的数据传输十分消耗性能。
解决方案使用异常处理导出请求,后台 MQ 通知自己进行处理。
MQ 消费之后,多线程处理 excel 文件导出,生成文件后上传到 FTP 等文件服务器。
前端直接查询并且展现对应的任务执行列表,去FTP 等文件服务器下载文件即可。
EXCEL 导出需要考虑的问题OOM正常的 poi 在处理比较大的 excel 的时候,会出现内存溢出。
网上的解决方案也比较多。
比如官方的SXSSF (Since POI 3.8 beta3)解决方式。
或者使用封装好的包1.easypoi ExcelBatchExportServer2.hutool BigExcelWriter原理都是强制使用 xssf 版本的Excel。
你也可以使用easyexcel,当然这个注释文档有些欠缺,而且设计的比较复杂,不是很推荐。
我这里使用的是hutool BigExcelWriter,懒得自己再写一遍。
FULL GC如果一次查询100W 条数据库,然后把这些信息全部加载到内存中,是不可取的。
建议有2个:1.限制每一次分页的数量。
比如一次最多查询 1w 条。
分成 100 次查询。
(必须)2.限制查询得总条数。
比如限制为最多 10W 条。
(根据实际情况选择)虽然使用者提出要导出类似于 3 个月的所有信息,但是数量太多,毫无意义。
(提出者自己可能体会不到)尽量避免 FULL-GC 的情况发生,因为目前的所有方式对于 excel 的输出流都会占用内存,100W 条很容易导致 FULL-GC。
Java数据导入Excelpackage com.bossy.base;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 : " + dataValue);//设置值统一为Stringcell.setCellValue(dataValue);}}//设置输入流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=//new jxl.write.WritableFont(WritableFont.ARIAL,255,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,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,可以到/project/showfiles.php?group_id=79926下载。