Java数据导入导出Excel
Java导入导出excel,easypoi的简单使用
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实现导出Excel(跨行跨列)
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 避免OOM(内存溢出)
产品需求产品经理需要导出一个页面的所有的信息到 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实现Excel导入导出以及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实现大批量数据导入导出(100W以上) -(二)导出
Java实现⼤批量数据导⼊导出(100W以上) -(⼆)导出使⽤POI或JXLS导出⼤数据量(百万级)Excel报表常常⾯临两个问题:1. 服务器内存溢出;2. ⼀次从数据库查询出这么⼤数据,查询缓慢。
当然也可以分页查询出数据,分别⽣成多个Excel打包下载,但这种⽣成还是很缓慢。
⼤数据量导⼊请参考:那么如何解决呢?我们可以借助XML格式利⽤模板替换,分页查询出数据从磁盘写⼊XML,最终会以Excel多sheet形式⽣成。
亲测2400万⾏数据,⽣成Excel⽂件4.5G,总耗时1.5分钟。
我利⽤StringTemplate模板解析技术对XML模板进⾏填充。
当然也可以使⽤FreeMarker, Velocity等Java模板技术实现。
⾸先引⼊StringTemplate所需Jar包:使⽤技术为 stringTemplatepom.xml:1 <dependency>2<groupId>antlr</groupId>3<artifactId>antlr</artifactId>4<version>2.7.7</version>5</dependency>67<dependency>8<groupId>org.antlr</groupId>9<artifactId>stringtemplate</artifactId>10<version>3.2.1</version>11</dependency>⾸先准备导出Excel模板,然后打开-》另存为-》选择格式为XML,然后⽤⽂本打开XML,提取XML头模板(head.st可通⽤),数据体模板(boday.st):head.st可通⽤:1<?xml version="1.0"?>2<?mso-application progid="Excel.Sheet"?>3<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"4 xmlns:o="urn:schemas-microsoft-com:office:office"5 xmlns:x="urn:schemas-microsoft-com:office:excel"6 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"7 xmlns:html="/TR/REC-html40">8<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">9<Created>1996-12-17T01:32:42Z</Created>10<LastSaved>2013-08-02T09:21:24Z</LastSaved>11<Version>11.9999</Version>12</DocumentProperties>13<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">14<RemovePersonalInformation/>15</OfficeDocumentSettings>16<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">17<WindowHeight>4530</WindowHeight>18<WindowWidth>8505</WindowWidth>19<WindowTopX>480</WindowTopX>20<WindowTopY>120</WindowTopY>21<AcceptLabelsInFormulas/>22<ProtectStructure>False</ProtectStructure>23<ProtectWindows>False</ProtectWindows>24</ExcelWorkbook>25<Styles>26<Style ss:ID="Default" ss:Name="Normal">27<Alignment ss:Vertical="Bottom"/>28<Borders/>29<Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>30<Interior/>31<NumberFormat/>32<Protection/>33</Style>34</Styles>boday.st:1 $worksheet:{2<Worksheet ss:Name="$it.sheet$">3<Table ss:ExpandedColumnCount="$it.columnNum$" ss:ExpandedRowCount="$it.rowNum$" x:FullColumns="1"4 x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">5 $it.rows:{6<Row>7<Cell><Data ss:Type="String">$1$</Data></Cell>8<Cell><Data ss:Type="String">$2$</Data></Cell>9<Cell><Data ss:Type="String">$3$</Data></Cell>10</Row>11 }$12</Table>13</Worksheet>14 }$⽣成⼤数据量Excel类:ExcelGenerator:1package test.exportexcel;23import org.antlr.stringtemplate.StringTemplate;4import org.antlr.stringtemplate.StringTemplateGroup;5import test.exportexcel.bean.Row;6import test.exportexcel.bean.Worksheet;78import java.io.*;9import java.util.ArrayList;10import java.util.List;11import java.util.Random;1213/**14 * 类功能描述:generator big data Excel15 *16 * @author WangXueXing create at 19-4-13 下午10:2317 * @version 1.0.018*/19public class ExcelGenerator {20public static void main(String[] args) throws FileNotFoundException{21 ExcelGenerator template = new ExcelGenerator();22 template.output2();23 }2425/**26 * ⽣成数据量⼤的时候,该⽅法会出现内存溢出27 * @throws FileNotFoundException28*/29public void output1() throws FileNotFoundException{30 StringTemplateGroup stGroup = new StringTemplateGroup("stringTemplate");31 StringTemplate st4 = stGroup.getInstanceOf("test/exportexcel/template/test");32 List<Worksheet> worksheets = new ArrayList<>();3334 File file = new File("/home/barry/data/output.xls");35 PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(file)));3637for(int i=0;i<30;i++){38 Worksheet worksheet = new Worksheet();39 worksheet.setSheet("第"+(i+1)+"页");40 List<Row> rows = new ArrayList<>();41for(int j=0;j<6000;j++){42 Row row = new Row();43 row.setName1("zhangzehao");44 row.setName2(""+j);45 row.setName3(i+" "+j);46 rows.add(row);47 }48 worksheet.setRows(rows);49 worksheets.add(worksheet);50 }5152 st4.setAttribute("worksheets", worksheets);53 writer.write(st4.toString());54 writer.flush();55 writer.close();56 System.out.println("⽣成excel完成");57 }5859/**60 * 该⽅法不管⽣成多⼤的数据量,都不会出现内存溢出,只是时间的长短61 * 经测试,⽣成2400万数据,2分钟内,4.5G⼤的⽂件,打开⼤⽂件就看内存是否⾜够⼤了62 * 数据量⼩的时候,推荐⽤JXLS的模板技术⽣成excel⽂件,谁⽤谁知道,⼤数据量可以结合该⽅法使⽤63 * @throws FileNotFoundException64*/65public void output2() throws FileNotFoundException{66long startTimne = System.currentTimeMillis();67 StringTemplateGroup stGroup = new StringTemplateGroup("stringTemplate");6869//写⼊excel⽂件头部信息70 StringTemplate head = stGroup.getInstanceOf("test/exportexcel/template/head");71 File file = new File("/home/barry/data/output.xls");72 PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(file)));73 writer.print(head.toString());74 writer.flush();7576int sheets = 400;77//excel单表最⼤⾏数是6553578int maxRowNum = 60000;7980//写⼊excel⽂件数据信息81for(int i=0;i<sheets;i++){82 StringTemplate body = stGroup.getInstanceOf("test/exportexcel/template/body");83 Worksheet worksheet = new Worksheet();84 worksheet.setSheet(" "+(i+1)+" ");85 worksheet.setColumnNum(3);86 worksheet.setRowNum(maxRowNum);87 List<Row> rows = new ArrayList<>();88for(int j=0;j<maxRowNum;j++){89 Row row = new Row();90 row.setName1(""+new Random().nextInt(100000));91 row.setName2(""+j);92 row.setName3(i+""+j);93 rows.add(row);94 }95 worksheet.setRows(rows);96 body.setAttribute("worksheet", worksheet);97 writer.print(body.toString());98 writer.flush();99 rows.clear();100 rows = null;101 worksheet = null;102 body = null;103 Runtime.getRuntime().gc();104 System.out.println("正在⽣成excel⽂件的 sheet"+(i+1));105 }106107//写⼊excel⽂件尾部108 writer.print("</Workbook>");109 writer.flush();110 writer.close();111 System.out.println("⽣成excel⽂件完成");112long endTime = System.currentTimeMillis();113 System.out.println("⽤时="+((endTime-startTimne)/1000)+"秒");114 }115 }定义JavaBean:WorkSheet.java:1package test.exportexcel.bean;23import java.util.List;45/**6 * 类功能描述:Excel sheet Bean7 *8 * @author WangXueXing create at 19-4-13 下午10:219 * @version 1.0.010*/11public class Worksheet {12private String sheet;13private int columnNum;14private int rowNum;15private List<Row> rows;1617public String getSheet() {18return sheet;19 }20public void setSheet(String sheet) {21this.sheet = sheet;22 }2324public List<Row> getRows() {25return rows;26 }27public void setRows(List<Row> rows) {28this.rows = rows;29 }3031public int getColumnNum() {32return columnNum;33 }34public void setColumnNum(int columnNum) {35this.columnNum = columnNum;36 }3738public int getRowNum() {39return rowNum;40 }41public void setRowNum(int rowNum) {42this.rowNum = rowNum;43 }44 }Row.java:1package test.exportexcel.bean;23/**4 * 类功能描述:Excel row bean5 *6 * @author WangXueXing create at 19-4-13 下午10:227 * @version 1.0.08*/9public class Row {10private String name1;11private String name2;12private String name3;1314public String getName1() {15return name1;16 }17public void setName1(String name1) {1 = name1;19 }2021public String getName2() {22return name2;23 }24public void setName2(String name2) {2 = name2;26 }2728public String getName3() {29return name3;30 }31public void setName3(String name3) {3 = name3;33 }34 }另附实现源码: 此外,⼤数据量并并且Excel列较多时,会出现内存溢出。
java导出百万级数据到excel
java导出百万级数据到excel最近修改了⼀个导出员⼯培训课程的历史记录(⼀年数据),导出功能本来就有的,不过前台做了时间限制(只能选择⼀个⽉时间内的),还有⼀些必选条件,导出的数据⾮常有局限性。
⼼想:为什么要做出这么多条件限制呢?条件限制⽆所谓了,能限制导出数据的准确性,但是时间?如果我想导出⼀年的数据,还要⼀⽉⼀⽉的去导出,这也太扯了。
于是我试着放开时间js限制,让⽤户⾃⼰随便选好了,然后⾃⼰选了⼀段时间,选了⼏门课程,点击按钮导出,MD报错了,看后台⽇志说什么IO流报异常,看了下代码,代码也很简单,查询数据,⽤HSSFWorkbook 写⼊数据,关闭流,导出,似乎没什么问题。
于是去把查询的sql拉出来,放⼊数据库,查询数据,20w条数据,好吧,这下终于知道为什么加时间限制了,数据量过⼤程序处理不了,改代码吧。
虽说实际⼯作中很少有百万数据导⼊excel,但不缺少⼀些会excel的⾼⼿,分析对⽐数据,像我这种⼿残党是不⾏,他们怎么⽤暂时不⽤管,能不能实现,就是我们应该考虑的事了。
此案例能解决2个问题:1.⽤户导出速度过慢2.采⽤分页导出,以解决单个sheet页数据量过⼤,打开速度过慢简单介绍下我的操作:HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls,⼀张表最⼤⽀持65536⾏数据,256列,也就是说⼀个sheet页,最多导出6w多条数据XSSFWorkbook:是操作Excel2007-2010的版本,扩展名是.xlsx对于不同版本的EXCEL⽂档要使⽤不同的⼯具类,如果使⽤错了,会提⽰如下错误信息。
org.apache.poi.openxml4j.exceptions.InvalidOperationExceptionorg.apache.poi.poifs.filesystem.OfficeXmlFileException它的⼀张表最⼤⽀持1048576⾏,16384列,关于两者介绍,对下⾯导出百万数据很重要,不要使⽤错了!2.SXSSFWorkbook使⽤⽅法和 HSSFWorkbook差不多,如果你之前和我⼀样⽤的HSSFWorkbook,现在想要修改,则只需要将HSSFWorkbook改成SXSSFWorkbook即可,下⾯有我介绍,具体使⽤也可参考。
Java导入导出Excel工具类ExcelUtil
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格式数据(含每条数据的附件)
,批量导出数据到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(跨⾏,跨列)先来个最终结果样式:第⼀步:传参,后期可根据⾃⼰需要进⾏调整。
我这⾥需要的是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);}}我这⾥页签是固定的名称可根据⾃⼰的需要根据参数来进⾏判断页签。
关于Java中excel表格导出的总结(Java程序导出模板和Java根据模板导出表格两种。。。
关于Java中excel表格导出的总结(Java程序导出模板和Java根据模板导出表格两种。
导出excel通⽤模板(程序定义模板导出)转载原⽂:如下代码,本⽅法主要⽤于程序定义模板格式,并导出⽂件。
该⽅法将定义和创建分离,达到了⼀定解耦合,降低了开发复杂度。
但是依然是程序定义模板,对模板的样式需要程序控制,没有达到将数据和样式分离的⽬的。
改良版,关于添加依赖之类的之前⼀篇⽂章⾥⾯有。
这篇是把之前的⽅法抽成通⽤模板。
⼀、添加⼀个实体类package com.lencity.securitymanagementplatform.data.entity;import java.util.List;public class XlsData {public static final int DATA_TYPE_INTEGER = 0;public static final int DATA_TYPE_STRING = 1;private List<String> titles;//表头private List<Integer> types;//数据类型private List<List<Object>> values;存表数据public List<Integer> getTypes() {return types;}public void setTypes(List<Integer> types) {this.types = types;}public List<String> getTitles() {return titles;}public void setTitles(List<String> titles) {this.titles = titles;}public List<List<Object>> getValues() {return values;}public void setValues(List<List<Object>> values) {this.values = values;}}⼆、创建⼀个service类package com.lencity.securitymanagementplatform.service;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.OutputStream;import java.io.UnsupportedEncodingException;import .URLEncoder;import java.util.List;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFDataFormat;import ermodel.HSSFFont;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import ermodel.HorizontalAlignment;import org.springframework.stereotype.Service;import com.lencity.securitymanagementplatform.data.entity.XlsData;@Servicepublic class XlsService {//写⼀个接⼝,哪个控制器需要加上导出excel功能就继承这个接⼝public static interface IXlsOutputProcessor {public XlsData processXlsData(Map<String, Object> condition);}//解析数据创建excelpublic HSSFWorkbook createExcelData(IXlsOutputProcessor processor, Map<String, Object> condition) {XlsData xlsData = processor.processXlsData(condition);HSSFWorkbook workbook = new HSSFWorkbook();HSSFSheet sheet = workbook.createSheet("统计表");// 创建⼀个excel表单HSSFRow titleRow = sheet.createRow(0);// 设置列宽,setColumnWidth的第⼆个参数要乘以256,这个参数的单位是1/256个字符宽度sheet.setColumnWidth(1, 15 * 256);sheet.setColumnWidth(3, 20 * 256);HSSFCellStyle style = workbook.createCellStyle();style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));// 设置⽇期格式HSSFFont font = workbook.createFont();// 设置为居中加粗font.setBold(true);style.setAlignment(HorizontalAlignment.CENTER);style.setFont(font);List<String> titles = xlsData.getTitles();HSSFCell cell;/* 构造表头 */for (int i = 0; i < titles.size(); i++) {cell = titleRow.createCell(i);cell.setCellValue(titles.get(i));cell.setCellStyle(style);}int rowNum = 1;List<Integer> dataTypes = xlsData.getTypes();List<List<Object>> values = xlsData.getValues();for (int i = 0; i < values.size(); i++) {List<Object> value = values.get(i);HSSFRow row = sheet.createRow(rowNum);for (int j = 0; j < value.size(); j++) {switch (dataTypes.get(j)) {case XlsData.DATA_TYPE_INTEGER:row.createCell(j).setCellValue((Integer) value.get(j));break;case XlsData.DATA_TYPE_STRING:row.createCell(j).setCellValue((String) value.get(j));break;}}rowNum++;}return workbook;}// 浏览器导出excelpublic void buildExcelDocument(String filename, HSSFWorkbook workbook, HttpServletResponse response)throws Exception {response.reset();response.setContentType("application/vnd.ms-excel");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "utf-8")); OutputStream outputStream = response.getOutputStream();workbook.write(outputStream);outputStream.flush();outputStream.close();}// 下载excel模板功能public void downloadTemplate(HttpServletResponse response,HttpServletRequest request) throws Exception {String fileName="导出模板.xls";response.reset();response.setContentType("application/vnd.ms-excel");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8")); String filePath=request.getServletContext().getRealPath("/excel/")+fileName;FileInputStream input=new FileInputStream(filePath);OutputStream out=response.getOutputStream();byte[] b=new byte[2048];int len;while((len=input.read(b))!=-1) {out.write(b,0,len);}response.setHeader("Content-Length", String.valueOf(input.getChannel().size()));input.close();}}三、控制器假设我们要在⽤户页⾯加上导出表格的功能,那就在⽤户的控制器上继承接⼝public class UserController implements IXlsOutputProcessor {继承之后需要在控制器中重写接⼝⽅法,导出的表格样式.png关于封装数据,主要就是根据⾃⼰实际的项⽬需求,来构造数据了// 封装数据@Overridepublic XlsData processXlsData(Map<String, Object> condition) {List<String> titles = new ArrayList<>();//表头List<Integer> dataTypes = new ArrayList<>();//表数据类型List<List<Object>> values = new ArrayList<>();//表头对应的数据titles.add("姓名");dataTypes.add(XlsData.DATA_TYPE_STRING);titles.add("⼿机号码");dataTypes.add(XlsData.DATA_TYPE_STRING);titles.add("职位");dataTypes.add(XlsData.DATA_TYPE_STRING);titles.add("部门");dataTypes.add(XlsData.DATA_TYPE_STRING);List<User> users = userService.getUsersByCondition(condition);XlsData xlsData = new XlsData();xlsData.setTitles(titles);xlsData.setTypes(dataTypes);for (User user : users) {List<Object> tmpList = new ArrayList<>();tmpList.add(user.getName());tmpList.add(user.getMobile());tmpList.add(user.getPosition());tmpList.add(departmentService.getDepartmentNameByDepartmentCode(user.getDepartmentCode()));values.add(tmpList);}xlsData.setValues(values);return xlsData;}// 导出excel,前台js,点击导出excel 关联的路径就是这个@PostMapping(value = "/downLoadXls")@ResponseBodypublic String downLoadXls(Map<String, Object> condition, HttpServletResponse response) throws Exception { String fileName = "导出excel.xls";HSSFWorkbook workbook = xlsService.createExcelData(this, condition);xlsService.buildExcelDocument(fileName, workbook, response);JSONObject jsonObject = new JSONObject();jsonObject.put("code", 1);return jsonObject.toString();}// 下载模板,前台js,点击下载模板关联的路径就是这个@PostMapping(value = "/downloadTemplate")@ResponseBodypublic String downloadTemplate(HttpServletResponse response,HttpServletRequest request) throws Exception { String fileName = "导出excel.xls";xlsService.downloadTemplate(response, request);JSONObject jsonObject = new JSONObject();jsonObject.put("code", 1);return jsonObject.toString();}前台界⾯.png模板的存放位置前台按钮代码<button type="button" class="btn btn-primary waves-effect" onclick="downloadTemplate()" id="downloadTemplate"><i class="material-icons">vertical_align_bottom</i><span>下载模板</span></button><button type="button" class="btn btn-primary waves-effect"onclick="exportExcel()"><i class="material-icons">vertical_align_bottom</i><span>导出表格</span></button>jsform表单⾥⾯是页⾯的表单筛选条件,如果要导数据库所有的数据,可把form表单去掉。
JAVA笔记-如何将百万级数据高效的导出到Excel表单
JAVA笔记-如何将百万级数据⾼效的导出到Excel表单 今天,⼀朋友问我使⽤JAVA有没有什么办法导出百万级的数据到Excel⼯作表。
当时我的第⼀个念头就是这真的是⼀个好疯狂的念头。
然后就想假如真的有这样类似的需求,我⾃⼰应该怎么做呢? ps: ⾸先科普⼀下基础知识 Excel 2003及以下的版本。
⼀张表最⼤⽀持65536⾏数据,256列。
也就是说excel2003完全不可能满⾜百万数据导出的需求。
Excel 2007-2010版本。
⼀张表最⼤⽀持1048576⾏,16384列; 笔者使⽤的是office 2010,更⾼的版本笔者没有使⽤过,暂时⽆法判断。
由此看来百万级的数据量对Excel⾃⾝已经是属于接近极限的程度。
假如我们有更⼤的需求怎么办呢? 既然单表⽀持最⼤是104w条数据,那么更⼤的需求量我们就只能通过程序级分表操作的⽅式来实现了。
O(∩_∩)O哈哈~ 对于操作Excel的类库。
笔者其实了解的并不是很多。
只是很早以前使⽤过POI这个类库,感觉很不错。
于是决定从它⼊⼿。
看看POI有没有什么⽐较有效的好点的解决办法。
由于笔者以前使⽤的POI版本⽐较低。
⽽且使⽤于excel 2003版本。
所以遇到了不少问题。
编辑器: Intellij IDEA 13.2 类库需求: POI-3.10-Final1<dependency>2<groupId>org.apache.poi</groupId>3<artifactId>poi</artifactId>4<version>3.10-FINAL</version>5</dependency> 新建⼀个Maven项⽬。
根据笔者以往的经验,直接使⽤POI写了⼀份代码。
执⾏的时候直接报错了。
1public static void Excel2003Operate(String filePath) throws Exception {2 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(new FileInputStream(new File(filePath)));3 HSSFSheet sheet = hssfWorkbook.getSheetAt(0);4for (int i = 0; i < 10000; i++) {5 HSSFRow hssfRow = sheet.createRow(i);6for (int j = 0; j < 10; j++) {7 HSSFCellUtil.createCell(hssfRow, j, String.valueOf(Math.random()));8 }9 }10 FileOutputStream out = new FileOutputStream("workbook.xlsx");11 hssfWorkbook.write(out);12 out.close();13 }1 Connected to the target VM, address: '127.0.0.1:62382', transport: 'socket'2 Exception in thread "main" org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different3 at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:131)4 at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:104)5 at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:128)6 at ermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:342)7 at ermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:323)8 at dev.tinyz.excel.POIUtil.Excel2003Operate(POIUtil.java:23)9 at dev.tinyz.excel.Main.main(Main.java:16)10 Disconnected from the target VM, address: '127.0.0.1:62382', transport: 'socket' 运⾏直接报错了。
用java实现Excel导入导出(easyExcel)
⽤java实现Excel导⼊导出(easyExcel)前⼏个⽉系统主要功能完结撒花,只剩下后台系统的报表。
为满⾜客户的需求,我需要将⽤户给的excel表数据导⼊到系统中,开始我没有怎么关注的这个业务,我却花费了很久很久的时间。
客户的需求⼀直在变,excel表格也⼀直在变。
我原本使⽤的是poi,从⼀开始的莫名其妙的报错,数据类型的转换错误,到各种的异常抓取,我的代码也越来越长。
这时候我寻找到了⼀个很⽅便且简单的⼯具easyExcel。
测试前准备⾸先映⼊excel⼯具的maven依赖<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.1</version></dependency>这⾥先准备下实体对象⽅便后⾯操作,这⾥写两个字节码去接受,是我⾃⼰的使⽤感受。
导出的数据是从系统⾥来,我们能保持系统内的数据的正确性,但是要导⼊的数据是来⾃⽤户,我们不能保证其正确性,所以统⼀拿字符串接受,这⾥就不会存在数字等转换异常了。
//导出使⽤的实体@Datapublic class Demo {@ExcelProperty(value = "⽤户名")private String username;@ExcelProperty(value = "密码")private String password;@ExcelProperty(value = "年龄")private Integer age;@ExcelProperty(value = "性别")private String gender;}//导⼊使⽤的实体@Datapublic class Demo {private String username;private String password;private String age;private String gender;}⼀、Excel导⼊// 普通导⼊public static void main(String[] args) throws FileNotFoundException {List<Demo> ls = EasyExcel.read(new FileInputStream("./demo.xlsx"), Demo.class, new SyncReadListener()).sheet(0).doReadSync();for (Demo l : ls) {//操作数据System.out.println(l);}}⼆、Excel导出1、普通导出//普通导出public static void main(String[] args) throws FileNotFoundException {ArrayList<Demo> ls = new ArrayList<>();for (int i = 0; i < 10; i++) {Demo demo = new Demo();demo.setUsername("name"+i);demo.setPassword("password"+i);demo.setAge(i);demo.setGender((i%10==0)?"男":"⼥");ls.add(demo);}EasyExcel.write(new FileOutputStream("./demo.xlsx"),Demo.class).sheet(0).doWrite(ls);}2、模板导出这⾥注意以下操作后⾯的⽅法,withTemplate代表着使⽤模板,needHead代表是否需要表头,useDefaultStyle意思为是否使⽤默认样式,也就是灰底⽩字的样式。
java实现数据的Excel导出,自定义导出字段,转换字典值
java实现数据的Excel导出,⾃定义导出字段,转换字典值第⼀版代码:基础功能跳转此⽂章:简介新增功能:1. 添加⾃定义字段导出功能, ⽤户可以选择字段进⾏导出2. 将字典类型数据进⾏转换(如:0=⼥,1=男, 将0转换为⼥, 1转换为男)3. 添加表头格式4. 随机⽂件名称, 防⽌多次导出时⽂件覆盖问题实现代码Excel注解@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)public @interface Excel {/*** 导出到Excel中的名字*/String name() default "";/*** ⽇期格式, 如: yyyy-MM-dd*/String dateFormat() default "";/*** 字典的key值*/String dictKey() default "";/*** 读取内容转表达式 (如: 0=男,1=⼥,2=未知)*/String dictExp() default "";}123456789101112131415161718192021222324public class ExcelUtil<T> {/*** ⼯作薄*/private Workbook wb;/*** ⼯作表*/private Sheet sheet;/*** 需要导出的数据*/private List<T> exportList;/*** 对象的class对象*/private Class<T> clazz;/*** 被选中需要导出的字段名称*/private Map<String, Object> checkedFieldsName;/*** 被选中需要导出的字段对象*/private List<Field> checkedFields;/*** 包含需要字典转换的字段对象*/private List<Field> fieldsContainDict;/*** 对象中的字典值*/private Map<String, Map<String, String>> dicts;private ExcelUtil(){}public ExcelUtil(Class<T> clazz){this.clazz = clazz;}/**** @param list* @param sheetName* @param fieldsName*/public void exportExcel(List<T> list, Map<String, Object> fieldsName, String sheetName){ // 初始化数据init(list, sheetName, fieldsName);// 转换字典值try {convertDict();} catch (IllegalAccessException e) {e.printStackTrace();}// sheet第⼀⾏加⼊名称数据createTopRow();// sheet其他⾏,添加⽬标数据try {createOtherRow();} catch (IllegalAccessException e) {e.printStackTrace();}// 导出wbtry(OutputStream outFile = new FileOutputStream(generateFileName())){wb.write(outFile);} catch (IOException e) {e.printStackTrace();}}}/*** 添加导出数据*/private void createOtherRow() throws IllegalAccessException {for (int rowNum = 1; rowNum <= exportList.size(); rowNum++) {Row row = sheet.createRow(rowNum);T t = exportList.get(rowNum - 1);for (int colNum = 0; colNum < checkedFields.size(); colNum++) {Cell cell = row.createCell(colNum);Field field = checkedFields.get(colNum);field.setAccessible(true);// 单元格设置值addCell(cell, field, t);}}}/*** 单元格中添加数据** @param cell 单元格* @param field 字段* @param t list中的⼀条数据*/private void addCell(Cell cell, Field field, T t) throws IllegalAccessException {Class<?> fieldType = field.getType();if (String.class == fieldType) {cell.setCellValue((String) field.get(t));} else if ((Integer.TYPE == fieldType) || (Integer.class == fieldType)) {cell.setCellValue((Integer) field.get(t));} else if ((Long.TYPE == fieldType) || (Long.class == fieldType)) {cell.setCellValue((Long) field.get(t));} else if ((Double.TYPE == fieldType) || (Double.class == fieldType)) {cell.setCellValue((Double) field.get(t));} else if ((Float.TYPE == fieldType) || (Float.class == fieldType)) {cell.setCellValue((Float) field.get(t));} else if (Date.class == fieldType) {String dateFormat = field.getAnnotation(Excels.class).dateFormat();cell.setCellValue(dateFormat((Date) field.get(t), dateFormat));}}/*** 时间格式转换* @param date ⽇期* @param dateFormat ⽇期格式* @return*/private String dateFormat(Date date, String dateFormat) {if (dateFormat == null || "".equals(dateFormat)) {dateFormat = "yyyy-MM-dd HH:mm:ss";}SimpleDateFormat df = new SimpleDateFormat(dateFormat);return df.format(date);}/*** sheet第⼀⾏加⼊名称数据*/private void createTopRow() {Row row = sheet.createRow(0);Map<String, CellStyle> styles = createStyles(wb);for (int index = 0; index < checkedFields.size(); index++) {Cell cell = row.createCell(index);cell.setCellValue(checkedFields.get(index).getAnnotation(Excels.class).name()); System.out.println(styles.get("header"));cell.setCellStyle(styles.get("header"));}}private void convertDict() throws IllegalAccessException {for (Field field : fieldsContainDict) {Excels annotation = field.getAnnotation(Excels.class);String dictKey = annotation.dictKey();field.setAccessible(true);for (T t : exportList) {// 获取字段值String o = (String) field.get(t);field.set(t, dicts.get(dictKey).get(o));}}}/*** 将数据导出Excel** @param list 需要导出的数据* @param sheetName ⼯作表名称*/public void exportExcel(List<T> list, String sheetName){exportExcel(list, null, sheetName);}/*** 将数据导出Excel** @param list 需要导出的数据*/public void exportExcel(List<T> list) {exportExcel(list, null, "sheet");}/*** 初始化*/public void init(List<T> list ,String sheetName, Map<String, Object> fieldsName){ this.checkedFieldsName = fieldsName;this.exportList = list;// 初始化导出数据initExportList();// 初始化⼯作薄initWorkbook();// 初始化⼯作表initSheet(sheetName);// 初始化checkedFields, fieldsContainDictinitFields();// 根据注解⽣成⽣成字典generateObjDict();}/*** 初始化导出数据*/private void initExportList(){// 防⽌导出过程中出现空指针if(Objects.isNull(this.exportList)) {this.exportList = new ArrayList<>();}}/*** 初始化⼯作簿*/private void initWorkbook(){this.wb = new SXSSFWorkbook();}/*** 初始化⼯作表*/private void initSheet(String sheetName){this.sheet = wb.createSheet(sheetName);}* 1.如果checkedFieldsName没有定义(未⾃定义导出字段),所有字段全部导出 * 2.如果checkedFieldsName进⾏了定义,根据定义字段进⾏导出*/private void initFields(){// 获取对象所有字段对象Field[] fields = clazz.getDeclaredFields();// 过滤出checkedFieldsthis.checkedFields = Arrays.asList(fields).stream().filter(item -> {if(!Objects.isNull(this.checkedFieldsName)) {if (item.isAnnotationPresent(Excel.class)) {return checkedFieldsName.containsKey(item.getName());}} else {return item.isAnnotationPresent(Excel.class);}return false;}).collect(Collectors.toList());// 过滤出fieldsContainDictthis.fieldsContainDict = Arrays.asList(clazz.getDeclaredFields()).stream().filter(item -> !"".equals(item.getAnnotation(Excel.class).dictExp())).collect(Collectors.toList(}/*** 通过扫描字段注解⽣成字典数据*/private void generateObjDict(){if(fieldsContainDict.size() == 0) {return;}if(dicts == null) {dicts = new HashMap<>(); // Map<String, List<Map<String, String>>>}for (Field field : fieldsContainDict) {String dictKey = field.getAnnotation(Excel.class).dictKey();String exps = field.getAnnotation(Excel.class).dictExp();String[] exp = exps.split(",");Map<String, String> keyV = new HashMap<>();dicts.put(dictKey, keyV);for (String s : exp) {String[] out = s.split("=");keyV.put(out[0], out[1]);}System.out.println("字典值:"+ dicts);}}/*** 创建表格样式** @param wb ⼯作薄对象* @return 样式列表*/private Map<String, CellStyle> createStyles(Workbook wb){Map<String, CellStyle> styles = new HashMap<String, CellStyle>();// 数据格式CellStyle style = wb.createCellStyle();style.setAlignment(HorizontalAlignment.CENTER);style.setVerticalAlignment(VerticalAlignment.CENTER);style.setBorderRight(BorderStyle.THIN);style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); style.setBorderLeft(BorderStyle.THIN);style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());style.setBorderTop(BorderStyle.THIN);dataFont.setFontHeightInPoints((short) 10);style.setFont(dataFont);styles.put("data", style);// 表头格式style = wb.createCellStyle();style.cloneStyleFrom(styles.get("data"));style.setAlignment(HorizontalAlignment.CENTER);style.setVerticalAlignment(VerticalAlignment.CENTER);style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex()); style.setFillPattern(FillPatternType.SOLID_FOREGROUND);Font headerFont = wb.createFont();headerFont.setFontName("Arial");headerFont.setFontHeightInPoints((short) 10);headerFont.setBold(true);headerFont.setColor(IndexedColors.WHITE.getIndex());style.setFont(headerFont);styles.put("header", style);return styles;}/*** ⽣成随机名称,防⽌⽂件复写* @return*/private String generateFileName(){return "D:\\" + UUID.randomUUID().toString().replace("-", "") + ".xlsx";}}12345678910111213141516171819202122232425262728293031323334353637383948 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369使⽤⽅法将对象加上⼯具类需要的注解: @Data@NoArgsConstructor@AllArgsConstructorpublic class Student {@Excel(name = "姓名")private String name;@Excel(name = "年龄")private Integer age;@Excel(name = "出⽣⽇期", dateFormat = "yyyy-MM-dd")private Date birthday;@Excel(name = "性别", dictKey = "sex", dictExp = "1=男,2=⼥")private String sex;}1234567891011121314151617测试字典转换public static void main(String[] args) {ArrayList<Student> data = new ArrayList<>();Student student = new Student();student.setName("tom");student.setAge(19);student.setSex("1");student.setBirthday(new Date());data.add(student);ExcelUtil<Student> util = new ExcelUtil<>(Student.class);util.exportExcel(data, "⼈员信息表");}123456789101112输出结果:结果可以看出, 已将1转换为男了测试选择字段导出:若不⾃定义导出的字段, ⼯具将会把所有带有Excel注解的字段进⾏导出, 如上⽅所⽰。
java中将数据和图片导出到Excel文件中
String activitypk = request.getParameter("activitypk");//活动PK
List childGroups = abc.getChildgroup(activitypk);//得到此活动的所有小组
java.awt.image.BufferedImage bufferImg = ImageIO.read(jpgfile);
javax.imageio.ImageIO.write(bufferImg, "jpg", byteArrayOut);
patriarch.createPicture(anchor,wb.addPicture(
byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));//将统计图片添加到Excel文件中
wb.write(os);
os.close();
net.sf.excelutils.ExcelUtils.addValue("actionServlet", this);
for (int k = 0; k < childGroups.size(); k++) {
ApSfaGroupactivity activityGroup =(ApSfaGroupactivity) childGroups.get(k);//ApSfaGroupactivity为活动小组的Pojo
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
java多线程导入excel例子
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在macOS电脑中进行数据的导入和导出
用Java在macOS电脑中进行数据的导入和导出在日常工作中,我们经常需要处理各种数据,包括导入和导出数据。
而对于使用macOS操作系统的开发人员来说,如何利用Java语言进行数据的导入和导出是一个常见的需求。
本文将介绍如何在macOS 电脑中使用Java编程语言进行数据的导入和导出操作。
1. 准备工作在开始之前,我们需要确保已经安装了Java开发环境(JDK)以及适当的集成开发环境(IDE),比如Eclipse或IntelliJ IDEA。
同时,我们还需要准备好要处理的数据文件,可以是Excel表格、CSV文件或其他格式的数据文件。
2. 数据导入2.1 从Excel表格导入数据在macOS电脑中使用Java导入Excel表格数据通常需要借助第三方库,比如Apache POI。
首先,在项目中引入Apache POI相关的依赖,然后编写代码读取Excel文件中的数据并进行处理。
示例代码star:编程语言:javaFileInputStream fis = new FileInputStream("data.xlsx");XSSFWorkbook workbook = new XSSFWorkbook(fis);XSSFSheet sheet = workbook.getSheetAt(0);// 读取数据for (Row row : sheet) {for (Cell cell : row) {// 处理单元格数据}}workbook.close();示例代码end2.2 从CSV文件导入数据如果要从CSV文件中导入数据,可以使用Java自带的CSV解析库OpenCSV。
首先引入OpenCSV相关的依赖,然后编写代码读取CSV文件中的数据。
示例代码star:编程语言:javaCSVReader reader = new CSVReader(newFileReader("data.csv"));String[] nextLine;while ((nextLine = reader.readNext()) != null) {// 处理每一行数据}reader.close();示例代码end3. 数据导出3.1 导出数据到Excel表格要将数据导出到Excel表格,同样可以使用Apache POI库。
java使用EasyExcel导入导出excel
java使⽤EasyExcel导⼊导出excel使⽤alibab的EasyExce完成导⼊导出excel⼀、准备⼯作1、导包<!-- poi 相关--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><!-- esayexcel 2.1.7 --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.7</version></dependency>⼆、了解注解1、常⽤注解字段注解类注解@ColumnWith(列宽)@ColumnWidth(全局列宽)@ExcelProperty(字段配置)@HeadFontStyle(头样式)@HeadRowHeight(标题⾼度)@ContentFontStyle(内容字体样式)@ContentRowHeight(内容⾼度)2、@ExcelProperty注解必要的⼀个注解,注解中有三个参数value,index分别代表列明,列序号value和index只能⼆选⼀,通常不⽤设置converter1.value 通过标题⽂本对应2.index 通过⽂本⾏号对应@ExcelProperty(value = "编号", index = 0)private Long id;3、@ColumnWith注解设置列宽度,只有⼀个参数value,value的单位是字符长度,最⼤可以设置255个字符,因为⼀个excel单元格最⼤可以写⼊的字符个数就是255个字符public class ImeiEncrypt {@ColumnWidth(value = 255) //excel单个单元格最⼤长度255private String message;}4、@ContentFontStyle注解⽤于设置单元格内容字体格式的注解参数含义fontName字体名称fontHeightInPoints字体⾼度italic是否斜体参数含义strikeout是否设置删除⽔平线color字体颜⾊typeOffset偏移量underline下划线bold是否加粗charset编码格式5、@ContentStyle注解设置内容格式注解参数含义dataFormat⽇期格式hidden设置单元格使⽤此样式隐藏locked设置单元格使⽤此样式锁定quotePrefix在单元格前⾯增加`符号,数字或公式将以字符串形式展⽰horizontalAlignment设置是否⽔平居中wrapped设置⽂本是否应换⾏。
Java导入导出Excel工具类ExcelUtil
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登场了,作为一个工具类,其内的所有方法都是静态的,方便使用。
HutoolJava工具类库导出Excel,超级简单!
HutoolJava⼯具类库导出Excel,超级简单!⾸先在POM.xml中加⼊GAV<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.0.7</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.17</version></dependency>Excel写⼊实体类import lombok.AllArgsConstructor;import lombok.Data;import java.util.Date;@Data@AllArgsConstructorpublic class User {private String name;private int age;private Date birthday;}然后在控制层使⽤就⾏@RequestMapping("/export")@ResponseBodypublic void export(HttpServletResponse response) {List<User> list = new ArrayList<>();list.add(new User("zhangsan0", "1231", new Date()));list.add(new User("zhangsan1", "1232", new Date()));list.add(new User("zhangsan2", "1233", new Date()));list.add(new User("zhangsan3", "1234", new Date()));list.add(new User("zhangsan4", "1235", new Date()));list.add(new User("zhangsan5", "1236", new Date()));// 通过⼯具类创建writer,默认创建xls格式ExcelWriter writer = ExcelUtil.getWriter();//⾃定义标题别名writer.addHeaderAlias("name", "姓名");writer.addHeaderAlias("age", "年龄");writer.addHeaderAlias("birthDay", "⽣⽇");// 合并单元格后的标题⾏,使⽤默认标题样式writer.merge(2, "申请⼈员信息");// ⼀次性写出内容,使⽤默认样式,强制输出标题writer.write(list, true);//out为OutputStream,需要写出到的⽬标流//response为HttpServletResponse对象response.setContentType("application/vnd.ms-excel;charset=utf-8");//test.xls是弹出下载对话框的⽂件名,不能为中⽂,中⽂请⾃⾏编码String name = StringUtils.toUtf8String("申请学院");response.setHeader("Content-Disposition", "attachment;filename=" + name + ".xls");ServletOutputStream out = null;try {out = response.getOutputStream();writer.flush(out, true);} catch (IOException e) {e.printStackTrace();} finally {// 关闭writer,释放内存writer.close();}//此处记得关闭输出Servlet流IoUtil.close(out);}Excel读取1.读取Excel中所有⾏和列,都⽤列表表⽰ExcelReader reader = ExcelUtil.getReader("d:/aaa.xlsx");List<List<Object>> readAll = reader.read();2.读取为Map列表,默认第⼀⾏为标题⾏,Map中的key为标题,value为标题对应的单元格值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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,可以到下载。