java实现导出excel
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浏览器直接下载或者或以文件形式导出
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导出就是将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使用easyExcel导出excel数据案例
Java使⽤easyExcel导出excel数据案例easyExcel简介:Java领域解析、⽣成Excel⽐较有名的框架有Apache poi、jxl等。
但他们都存在⼀个严重的问题就是⾮常的耗内存。
如果你的系统并发量不⼤的话可能还⾏,但是⼀旦并发上来后⼀定会OOM或者JVM频繁的full gc。
easyExcel是阿⾥巴巴开源的⼀个excel处理框架,以使⽤简单、节省内存著称。
easyExcel采⽤⼀⾏⼀⾏的解析模式,并将⼀⾏的解析结果以观察者的模式通知处理easyExcel能⼤⼤减少占⽤内存的主要原因是在解析Excel时没有将⽂件数据⼀次性全部加载到内存中,⽽是从磁盘上⼀⾏⾏读取数据,逐个解析。
1.导⼊依赖【poi不能低于3.17,不然可能会报错】<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>1.1.2-beta5</version></dependency>2.控制层<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>1.1.2-beta5</version></dependency>3.导出模型package .hnezxjgl.model;import com.alibaba.excel.annotation.ExcelProperty;import com.alibaba.excel.metadata.BaseRowModel;import lombok.Data;@Datapublic class ExportModel extends BaseRowModel{/*** 账号*/@ExcelProperty(value = {"账号"}, index = 0)private String platformNum;/*** 姓名*/@ExcelProperty(value = {"姓名"}, index = 1)private String name;/*** ⾝份证号*/@ExcelProperty(value = {"⾝份证号"}, index = 2)private String idCardNum;/*** 性别*/@ExcelProperty(value = {"性别"}, index = 3)private String sexName;/*** 年级*/@ExcelProperty(value = {"年级"}, index = 4)private String gradeName;/*** 班级*/@ExcelProperty(value = {"班级"}, index = 5)private String className;/*** 学费缴费状态名称*/@ExcelProperty(value = "学费缴费状态名称",index = 6)private String studyFeeStatusName;/*** 书本费缴费状态名称*/@ExcelProperty(value = "书本费缴费状态名称",index = 7)private String bookFeeStatusName;}4.⼏万条数据实现秒导到此这篇关于Java使⽤easyExcel导出excel数据案例的⽂章就介绍到这了,更多相关Java easyExcel导出excel内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
Java导出数据生成Excel表格
Java导出数据⽣成Excel表格事先准备:⼯具类:package com.wazn.learn.util.export;import java.sql.Connection;import java.sql.DriverManager;public class DbUtil {private String dbUrl="jdbc:mysql://localhost:3306/basepro";private String dbUserName="user";private String dbPassword="user";private String jdbcName = "com.mysql.jdbc.Driver";public Connection getCon() throws Exception {Class.forName(jdbcName);Connection con = DriverManager.getConnection(dbUrl, dbUserName, dbPassword);return con;}public void closeCon(Connection con) throws Exception {if (con != null) {con.close();}}}package com.wazn.learn.util.export;import java.sql.ResultSet;import ermodel.Row;import ermodel.Sheet;import ermodel.Workbook;public class ExcelUtil {public static void fillExcelData(ResultSet rs, Workbook wb, String[] headers) throws Exception {int rowIndex = 0; //定义⾏的初始值Sheet sheet = wb.createSheet(); //创建sheet页Row row = sheet.createRow(rowIndex++); //⾏数⾃增+1//将头信息填进单元格for (int i = 0; i < headers.length; i++) {row.createCell(i).setCellValue(headers[i]);}while (rs.next()) {row = sheet.createRow(rowIndex++); //增加⾏数System.out.println(row);for (int i = 0; i < headers.length; i++) { // 添加内容row.createCell(i).setCellValue(rs.getObject(i + 1).toString());}}}}package com.wazn.learn.util.export;import java.io.OutputStream;import java.io.PrintWriter;import javax.servlet.http.HttpServletResponse;import ermodel.Workbook;public class ResponseUtil {public static void write(HttpServletResponse response, Object o) throws Exception {response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();out.println(o.toString());out.flush();out.close();}public static void export(HttpServletResponse response, Workbook wb, String fileName) throws Exception{ //设置头固定格式response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("utf-8"), "iso8859-1")); response.setContentType("text/html;charset=utf-8");OutputStream out = response.getOutputStream();wb.write(out);out.flush();out.close();}}Controller层:package com.wazn.learn.controller.teachclass;import java.sql.Connection;import java.sql.ResultSet;import javax.servlet.http.HttpServletResponse;import ermodel.HSSFWorkbook;import ermodel.Workbook;import org.apache.shiro.authz.annotation.RequiresPermissions;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import com.wazn.learn.dao.impl.ExportDao;import com.wazn.learn.util.export.DbUtil;import com.wazn.learn.util.export.ExcelUtil;import com.wazn.learn.util.export.ResponseUtil;import com.wordnik.swagger.annotations.ApiOperation;@Controller@Scope("prototype")@RequestMapping("/teach")public class ExportController {ExportDao exportDao;ExcelUtil excelUtil;@GetMapping("/page")public String stulook() {return "teach/course/export";}@SuppressWarnings("static-access")@ApiOperation(value = "导出Excel")@RequiresPermissions("upms:system:export")@RequestMapping(value = "/export", method = RequestMethod.GET)@ResponseBodypublic String export(HttpServletResponse response,String sdate,String edate) throws Exception {ExportDao exportDao = new ExportDao();DbUtil dbUtil = new DbUtil();Connection con = null;ExcelUtil excelUtil = new ExcelUtil();try {con = dbUtil.getCon();Workbook wb = new HSSFWorkbook();String headers[] = {"编号","学号","签到时间", "签到⽇期", "⽤户名","所属公司","职业"};ResultSet rs = exportDao.exportSign(con,sdate,edate);excelUtil.fillExcelData(rs, wb, headers);ResponseUtil.export( response, wb, "签到管理.xls");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {dbUtil.closeCon(con);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}return null;}@SuppressWarnings("static-access")@ApiOperation(value = "导出Excel")@RequiresPermissions("upms:system:export")@RequestMapping(value = "/export2", method = RequestMethod.GET)@ResponseBodypublic String export2(HttpServletResponse response) throws Exception {ExportDao exportDao = new ExportDao();DbUtil dbUtil = new DbUtil();Connection con = null;ExcelUtil excelUtil = new ExcelUtil();try {con = dbUtil.getCon();Workbook wb = new HSSFWorkbook();String headers[] = { "签到⽇期","签到⼈数","请假⼈数"};ResultSet rs = exportDao.exportSign2(con);excelUtil.fillExcelData(rs, wb, headers);ResponseUtil.export( response, wb, "签到综合.xls");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {dbUtil.closeCon(con);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}return null;}}dao层:package com.wazn.learn.dao.impl;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;public class ExportDao {public ResultSet exportSign(Connection con, String sdate, String edate) throws Exception{String sql="select s.id,u.stunum, FROM_UNIXTIME(s.signtime/1000),s.signdate,u.nickname,pany,u.job from teach_sign s join sys_user u on er_id=u.id ";if(sdate!=null&&sdate!=""){if(edate!=null&&edate!=""){sql+=" where s.signdate>='"+sdate+"' and s.signdate<='"+edate+"' ";}else{sql+=" where s.signdate>='"+sdate+"' ";}}else{if(edate!=null&&edate!=""){sql+=" where s.signdate<='"+edate+"' ";}else{}}StringBuffer sb = new StringBuffer(sql);PreparedStatement pstmt = con.prepareStatement(sb.toString());return pstmt.executeQuery();}public ResultSet exportSign2(Connection con) throws Exception{String sql="select signdate as signdate, count(distinct user_id)-count(leave1) as countuser,count(leave1) as countleave from teach_signs group by signdate";StringBuffer sb = new StringBuffer(sql);PreparedStatement pstmt = con.prepareStatement(sb.toString());return pstmt.executeQuery();}}前台页⾯:两个不同的,传参数根据⽇期和不传参数<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><%@ pageimport="org.springframework.security.core.context.SecurityContextHolder"%><%@ page import="com.wazn.learn.configure.security.CustomerUser"%><%String basePath = request.getContextPath();CustomerUser user = (CustomerUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>选择导出⽇期</title><script type="text/javascript"src="<%=basePath%>/res/js/jquery-1.12.4.min.js"></script><script src="<%=basePath%>/res/layui/layui.js" charset="utf-8"></script><link rel="stylesheet" href="<%=basePath%>/res/layui/css/layui.css"media="all"></head><style type="text/css"></style><body class="gray-bg"><div class="layui-form-item "><label class="layui-form-label">开始⽇期:</label><div class="layui-input-block"><input type="text" class="layui-input" placeholder="请选择开始时间" id="sdate1" name="sdate1"></div></div><div class="layui-form-item"><label class="layui-form-label">结束⽇期:</label><div class="layui-input-block"><input type="text" class="layui-input" placeholder="请选择截⽌时间" id="edate1" name="edate1"></div></div><div class="layui-input-block"><a class="waves-effect waves-button" href="javascript:;" onclick="exportAction()"><button class="layui-btn" style="transform: translateY(-3px);" data-type="reload">导出签到表格</button></a></div><script>//导出Excel⽂件function exportAction(){var s = $('#sdate1').val();var e = $('#edate1').val();var str="sdate='"+s+"'&&edate='"+e+"'";window.open("<%=basePath%>/teach/export?sdate="+s+"&&edate="+e+" ");}e(['table','form','laydate'], function(){var table = layui.table,form = layui.form,laydate = ydate;;laydate.render({elem: '#sdate1',type: 'date'});laydate.render({elem: '#edate1',type: 'date'});});</script></body></html><%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><%@ page import="org.springframework.security.core.context.SecurityContextHolder"%><%@ page import="com.wazn.learn.configure.security.CustomerUser"%><%String basePath = request.getContextPath();CustomerUser user = (CustomerUser)SecurityContextHolder.getContext().getAuthentication().getPrincipal();%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><script type="text/javascript" src="<%=basePath%>/res/js/jquery-1.12.4.min.js"></script><script src="<%=basePath%>/res/layui/layui.js" charset="utf-8"></script><link rel="stylesheet" href="<%=basePath%>/res/layui/css/layui.css" media="all"><title>数据报表</title></head><body><div style="margin: 0px; background-color: white; margin: 0 10px;"><blockquote class="layui-elem-quote" style="height: 45px"><div class="layui-col-md2"><a class="waves-effect waves-button" href="javascript:;" onclick="exportAction()"><button class="layui-btn" style="transform: translateY(-3px);" data-type="reload">导出签到表格</button></a></div></blockquote></div><table class="layui-table"lay-data="{url:'<%=basePath%>/teach/course/getsignreport', page:true, id:'idTest', limit: 10,limits: [10,20,30]}"lay-filter="demo"><thead><tr><th lay-data="{field:'signdate', width:'30%',align:'center', sort: true}">签到⽇期</th><th lay-data="{field:'user', width:'30%',align:'center',toolbar: '#bar1'}">签到⼈数</th><th lay-data="{field:'leave', width:'30%',align:'center' ,toolbar: '#bar2'}">请假⼈数</th></tr></thead></table><script>//导出Excel⽂件function exportAction(){window.open("<%=basePath%>/teach/export2");}</script><script type="text/html" id="bar1"><a class="layui-btn layui-btn-primary layui-btn-xs" id="test" lay-event="sign">{{d.countuser}}</a></script><script type="text/html" id="bar2"><a class="layui-btn layui-btn-primary layui-btn-xs" id="test" lay-event="leave">{{d.countleave}}</a></script><script>e(['table','form','laydate','layer'], function(){var table = layui.table,form = layui.form,layer=yer,laydate = ydate;;laydate.render({elem: '#edate',type: 'datetime'});laydate.render({elem: '#sdate',type: 'datetime'});laydate.render({elem: '#sdate1',type: 'date'});laydate.render({elem: '#edate1',type: 'date'});//监听⼯具条table.on('tool(demo)', function(obj){var data = obj.data;if(obj.event === 'sign'){layer.open({title : "签到详情",type : 2,area: ['70%', '80%'],content : "<%=basePath%>/teach/course/signlook?leave=0&date="+data.signdate,})}else if(obj.event==='leave'){layer.open({title : "请假详情",type : 2,area: ['80%', '80%'],content : "<%=basePath%>/teach/course/signlook?leave=1&date="+data.signdate, })}});var $ = layui.$, active = {reload: function(){var demoReload = $('#demoReload');//执⾏重载table.reload('idTest', {page: {curr: 1 //重新从第 1 页开始},where: {name: demoReload.val(),sdate:$('#sdate').val(),edate:$('#edate').val()}});}};$('.demoTable .layui-btn').on('click', function(){var type = $(this).data('type');active[type] ? active[type].call(this) : '';});});</script></body></html>。
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 导出 freemarker excel 集合实例-概述说明以及解释
java 导出freemarker excel 集合实例-概述说明以及解释1.引言文章1.1 概述部分的内容可以写作如下:Java是一种广泛使用的编程语言,而Excel作为一种常用的办公软件,经常使用于数据分析和报表生成等领域。
在实际开发中,我们经常需要将Java中的数据导出到Excel中进行展示或者进一步处理。
然而,Java自身并没有提供直接将数据导出为Excel的功能。
为了实现这个需求,我们可以借助第三方库Freemarker来进行Excel的导出。
Freemarker是一款模板引擎,它可以将Java中的数据与预先定义好的Excel模板文件进行结合,生成最终的Excel报表。
本文将介绍如何使用Java和Freemarker来实现Excel的导出功能。
首先,我们将探讨Java导出Excel的需求,了解在实际项目中我们可能会遇到的问题和要求。
接下来,我们将详细介绍如何使用Freemarker来实现Excel导出功能,并提供一些实例代码供读者参考。
通过本文的学习,读者将能够掌握使用Java和Freemarker导出Excel 的基本原理和方法,为以后类似需求的项目开发提供参考。
同时,我们也将对导出功能的局限性进行讨论,并展望未来可能的改进方向。
接下来,我们将开始探讨Java导出Excel的需求。
文章结构部分的内容:文章结构是指文章的组织架构和章节分布,它的设计直接影响读者对文章内容的理解和阅读体验。
本文将按照以下方式组织结构和分布各章节内容:1. 引言部分:1.1 概述:介绍本文主题以及所讨论的问题的背景和重要性。
说明Java导出FreeMarker Excel集合实例的意义和应用场景。
1.2 文章结构:本章节。
详细说明文章的整体框架和组织结构,以便读者能清晰地了解文章的逻辑和内容安排。
1.3 目的:明确本文的目标和目的,阐述我们要达到的效果和希望读者能够得到的收获。
2. 正文部分:2.1 Java导出Excel的需求:解释为什么我们需要在Java中进行Excel导出操作,列举一些具体的应用场景和需求案例。
Java导出excel进行换行的案例
Java导出excel进⾏换⾏的案例如下所⽰:String.valueOf((char)10)在导出excel 的时候,如果原始⽂字中含有 \n 字符, 如果把 \n 替换为<br/>,excel不会识别成换⾏符excel 认可 char(10) 作为换⾏符:scanSendCoupeMg.getRuleDesc().replace("\n", String.valueOf((char)10));scanSendCoupeMg.getRuleDesc().replace("<br/>", String.valueOf((char)10));补充知识:Java之POI⽣成Excel强制换⾏JAVA通过poi来操作Excel进⾏换⾏操作,通过设定CellStyle样式中的setWrapText属性为true,就可以通过\r\n的⽅式进⾏Excel的格⼦内换⾏了,同时说⼀下,在Excel中,设定⾏⾼的操作,需要注意设定⾏⾼,不能直接写成short,写的和本⾝直接在excel中显⽰的⾏⾼效果不⼀样,需要获取⾏⾼,然后设定⽐例换⾏在不更改原来样式的情况下,设定换⾏操作//获取存在的样式,在存在的样式的基础上进⾏修改操作CellStyle cellStyle = xlSheet.getCell(row+1, 7).getCellStyle();//设定这个wraptext的属性,就可以通过\r\n的操作进⾏换⾏了cellStyle.setWrapText(true);xlSheet.getCell(row, eCol.biko.col).setCellStyle(cellStyle);//设定数据,通过\r\n进⾏换⾏操作cell.setCellValue(new HSSFRichTextString("hello\r\n world!"));设定⾏⾼在POI操作⾏⾼中,我们直接写死的⾏⾼,⼀点⽤都没有,需要在获取原来的⾏⾼的情况下,然后乘除⼀个⽐例,然后转化为short类型,就可以了short rowHeight = (short)(xlSheet.getRow(row).getHeight()*((bikoList.size()-1)/2+1));xlSheet.getRow(row).setHeight(rowHeight);这个42的⾏⾼是,根据⼀⾏多⾼,然后*2算出来的,直接写成xlSheet.getRow(row).setHeight((short)42);的效果并不是*2的效果直接写死的⾏⾼,结果很坑爹啊,所以不能直接写死,写死了,效果不是想象中的那样以上这篇Java 导出excel进⾏换⾏的案例就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
JAVA的poi实现模版导出excel(带图片)
下面是本人使用java的poi实现使用模板到处excel,内容包含图片,使用两种不同的方式实现其到处excel。
但是使用jxl实现到处excel只能到处png格式。
package com.rxc.servlet;import java.awt.image.BufferedImage;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import ermodel.HSSFCell;import ermodel.HSSFClientAnchor;import ermodel.HSSFPatriarch;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import org.apache.poi.poifs.filesystem.POIFSFileSystem;public class OutExcelServlet extends HttpServlet {private static final long serialVersionUID = 1L;public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String accident_id = request.getParameter("accident_id");String OnputimagePath = null;/***********************************************使用poi实现excel模版导出excel********************/try {POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("d:\\设备异常分析报告.xls"));HSSFWorkbook wb = new HSSFWorkbook(fs);HSSFSheet sheet = wb.getSheet("设备异常分析报告");HSSFRow row = sheet.getRow(2);HSSFCell cell = row.getCell((short) 2);if (cell == null){cell = row.createCell((short) 2);}cell.setCellType(HSSFCell.CELL_TYPE_STRING);cell.setCellValue("12321212");ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();String InputimagePath = "d:\\1012051443548604211337adf6.jpg";BufferedImage bufferImg = ImageIO.read(new File(InputimagePath));ImageIO.write(bufferImg,"JPG",byteArrayOut);//设置图片大小,位置HSSFClientAnchor anchor = new HSSFClientAnchor(5,0,500,122,(short) 0, 5,(short)10,15);//创建HSSFPatriarch patri = sheet.createDrawingPatriarch();patri.createPicture(anchor ,wb.addPicture(byteArrayOut.toByteArra y(), HSSFWorkbook.PICTURE_TYPE_PNG));// 输出文件OnputimagePath = "d:\\test1.xls";FileOutputStream fileOut = new FileOutputStream(OnputimagePath);wb.write(fileOut);fileOut.close();} catch (Exception e) {e.printStackTrace();}// 检查文件是否存在File obj = new File(OnputimagePath);if (!obj.exists()) {r esponse.setContentType("text/html;charset=GBK");r esponse.getWriter().print("指定文件不存在!");return;}// 读取文件名:用于设置客户端保存时指定默认文件名int index = stIndexOf("\\"); // 前提:传入的path 字符串以“\”表示目录分隔符String fileName = OnputimagePath.substring(index + 1);// 写流文件到前端浏览器ServletOutputStream out = response.getOutputStream();response.setHeader("Content-disposition","attachment;filename=" + fileName);BufferedInputStream bis = null;BufferedOutputStream bos = null;try {bis = new BufferedInputStream(new FileInputStream(OnputimagePath));bos = new BufferedOutputStream(out);byte[] buff = new byte[2048];int bytesRead;while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead);}} catch (IOException e) {throw e;} finally {if (bis != null)bis.close();if (bos != null)bos.close();}}/*****************使用jxl实现excel模版导出excel 但导出图片仅支持png格式**************************************String realpath = "D:/test.xls";try {CopeDate data = new CopeDate();MapList mp = data.getdata(accident_id);//选择模板文件:Workbook wb = Workbook.getWorkbook(new File(realpath));//第二步:通过模板得到一个可写的Workbook:第一个参数是一个输出流对象,第二个参数代表了要读取的模板File targetFile = new File("D:/test1.xls");WritableWorkbook wwb = Workbook.createWorkbook(targetFile, wb);//第三步:选择模板中名称为设备异常的Sheet:WritableSheet wws = wwb.getSheet("JustCell");//第四步:选择单元格,写入动态值,根据单元格的不同类型转换成相应类型的单元格:Label A1 = new Label(0, 1,mp.getRow(0).get("accident_name"));wws.addCell(A1);//插入图片File imgFile = new File("D:/test.png");WritableImage image = new WritableImage(2, 1, 8, 20, imgFile);wws.addImage(image);wwb.write();wwb.close();wb.close();} catch (BiffException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (WriteException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}********************************************************************* *******/}。
用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通过POI和easypoi实现Excel的导出
java通过POI和easypoi实现Excel的导出前⾔在⼯作经常会遇到excel导出报表的功能,⾃⼰也做过⼀些,然后在项⽬⾥看到同事封装的⼀个excel导出⼯具类,着实不错,拿来分享⼀下。
然后,⼜在⽹上看到⼀个使⽤easypoi实现cxcel导出的博客,于是⾃⼰也仿着搞了⼀下,在这也分享⼀下。
使⽤POI实现excel导出⾸先,引⼊jar包,这是POI需要的jar包。
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency>下⾯是主要的实现⽅法。
定义⼀个函数式接⼝,⽤于⾃定义格式。
package com.mz.util;import java.io.IOException;/*** @version V1.0* @Description:* @date 2018/10/31 17:16*/@FunctionalInterfacepublic interface ExportConsumer<ByteArrayOutputStream, Workbook, List> {/***⾃定义导出数据拼装* @param fileOut 输出流* @param wb workbook对象* @param listData 数据集* @throws IOException*/void accept(ByteArrayOutputStream fileOut, Workbook wb, List listData) throws IOException;}⼯具类主要⽅法package com.mz.util;import ermodel.Workbook;import org.springframework.http.HttpHeaders;import org.springframework.http.HttpStatus;import org.springframework.http.MediaType;import org.springframework.http.ResponseEntity;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.nio.charset.StandardCharsets;import java.util.List;public class POIExportUtil {/*** 导出excel** @param fileOut 输出流* @param wb excel workbook对象* @param listData 需要导出的数据* @param consumer ⾃定义导出excel的格式* @param fileName ⽂件名* @return ResponseEntity* @throws IOException*/public static <T> ResponseEntity<byte[]> exportExcel(ByteArrayOutputStream fileOut,Workbook wb,List<T> listData,String fileName,ExportConsumer<ByteArrayOutputStream, Workbook, List<T>> consumer) throws IOException {consumer.accept(fileOut, wb, listData);HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);headers.setContentDispositionFormData("attachment", new String((fileName + ".xls").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));return new ResponseEntity<>(fileOut.toByteArray(), headers, HttpStatus.OK);}}使⽤案例,页⾯通过<a>标签访即可。
mongo百万数据导出excel java代码
MongoDB是一个广泛使用的文档数据库,在处理大量数据时非常高效。
以mongo百万数据导出excel为主题,我将针对这一需求展开讨论。
在文章中,我将从mongo数据库的基本概念开始,逐步深入探讨如何使用java代码实现百万数据导出excel的功能。
1. MongoDB简介MongoDB是一个开源的文档型数据库,它以高性能、高可用性和灵活的数据模型而闻名。
在处理大量数据时,MongoDB能够提供出色的性能表现,因此在实际应用中被广泛使用。
其文档式数据存储结构和灵活的数据模型为程序员提供了很大的便利。
2. MongoDB数据导出在实际项目中,有时候我们需要将MongoDB中的数据导出到excel 表格中,以便进行进一步的分析和处理。
在这个过程中,需要使用java代码来实现数据的读取和导出功能。
在这篇文章中,我将共享一个实现百万数据导出excel的java代码示例,并提供详细的解释和分析。
3. Java代码实现在实际操作中,我们可以使用Java语言搭配MongoDB的Java驱动程序来实现数据的读取和导出功能。
我们需要建立连接到MongoDB 数据库的连接,并且查询需要导出的数据。
通过java代码将数据逐行写入excel表格中,最终完成百万数据导出excel的功能。
4. 个人观点和总结从个人观点来看,使用MongoDB进行大数据处理可以极大地提高程序的性能和灵活性。
与传统的关系型数据库相比,MongoDB在处理大量数据时更为高效和简洁。
而在实际操作中,通过java代码实现百万数据导出excel功能也为数据分析和处理提供了便利。
通过这篇文章,我希望读者能够深入了解MongoDB数据库的基本概念和数据导出功能,并能够通过java代码实现百万数据导出excel的功能。
我也希望读者能够在实际项目中灵活应用这些知识,提高工作效率和数据处理能力。
在撰写本文的过程中,我充分考虑了你对mongo百万数据导出excel java代码的需求,以多角度展开讨论,希望能够帮助你更深入地理解和使用相关知识。
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设置⽂本是否应换⾏。
javaexcel动态字段导出的方法
javaexcel动态字段导出的方法### Java Excel动态字段导出的方法在Java应用程序中,Excel文件的动态字段导出是一项常见需求,尤其是在报表生成和数据分析的场景下。
以下将详细介绍如何使用Java实现动态字段导出到Excel的方法。
#### 1.准备工作- 确保你的项目中引入了Apache POI库,这是一个强大的Java库,用于处理Microsoft Office文档。
- 创建一个Excel模板,如果你需要固定某些表头或者样式。
#### 2.实现动态字段导出的步骤##### 步骤1:定义数据模型首先,定义一个Java对象来表示Excel表中的数据模型。
```javapublic class DataModel {private String fieldName1;private int fieldNumber2;// 其他字段...// 省略getter和setter方法}```##### 步骤2:创建Excel工作簿```javaimport ermodel.*;import ermodel.XSSFWorkbook; Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("数据");Row headerRow = sheet.createRow(0);```##### 步骤3:设置表头动态设置表头,可以根据实际需求添加或减少字段。
```javaString[] headers = {"字段1", "字段2", "字段3"};for (int i = 0; i < headers.length; i++) {Cell cell = headerRow.createCell(i);cell.setCellValue(headers[i]);}```##### 步骤4:填充数据```javaList<DataModel> dataModels = // 假设这是你的数据源int rowNum = 1;for (DataModel model : dataModels) {Row row = sheet.createRow(rowNum++);row.createCell(0).setCellValue(model.getFieldName1());row.createCell(1).setCellValue(model.getFieldNumber2());// 其他字段...}```##### 步骤5:设置样式(可选)根据需要,可以为单元格设置样式。
java导出Excel大数据量,自己经验总结!(二)
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// 设置下载头部信息。
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为标题对应的单元格值。
java通用的导出excel合并单元格格式(二)
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,提⾼处理性能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
java实现导出excel最近有个项目涉及到从java数据库access提取数据到excel中,我搜索了大概有两种办法一种是poi一种是jxl。
下面介绍下这两种方法。
POI为apache公司的一个子项目,主要是提供一组操作windows文档的Java API.Java Excel俗称jxl是一开放源码项目,通过它Java开发人员可以读取Excel 文件的内容、创建新的Excel文件、更新已经存在的Excel文件。
使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。
因为是使用Java编写的,所以我们在Web应用中可以通过JSP、Servlet来调用API实现对Excel数据表的访问。
就这两者的区别,主要谈下JVM虚拟机内存消耗的情况.数据量3000条数据,每条60列.JVM虚拟机内存大小64M.使用POI:运行到2800条左右就报内存溢出.使用JXL:3000条全部出来,并且内存还有21M的空间.可想而知,在对内存的消耗方面差距还是挺大的.也许是由于JXL在对资源回收利用方面做的还挺不错的.关于两者效率方面,没有研究过,我想这个也是基于大数据量而言的,数据量小的话基本上差别不大,也不难被发觉.但是大的数据量,POI消耗的JVM内存远比JXL消耗的多.但相比提供的功能的话,JXL 又相对弱了点.所以如果要实现的功能比较复杂的情况下可以考虑使用POI,但如果只想生成一些大数据量可以考虑使用JXL,或者CSV也是一个不错的选择,不过CSV并不是真正的excel.jxl.jar概述通过java操作excel表格的工具类库支持Excel 95-2000的所有版本生成Excel 2000标准格式支持字体、数字、日期操作能够修饰单元格属性支持图像和图表应该说以上功能已经能够大致满足我们的需要。
最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。
另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。
基本操作一、创建文件拟生成一个名为“测试数据.xls”的Excel文件,其中第一个工作表被命名为“第一页”,大致效果如下:代码(CreateXLS.java)://生成Excel的类import java.io.*;import jxl.*;import jxl.write.*;public class CreateXLS{public static void main(String args[]){try{//打开文件WritableWorkbook book=Workbook.createWorkbook(new File(“测试.xls”));//生成名为“第一页”的工作表,参数0表示这是第一页WritableSheet sheet=book.createSheet(“第一页”,0);//在Label对象的构造子中指名单元格位置是第一列第一行(0,0)//以及单元格内容为testLabel label=new Label(0,0,”test”);//将定义好的单元格添加到工作表中sheet.addCell(label);jxl.write.Number number = new jxl.write.Number(1,0,789.123);sheet.addCell(number);//写入数据并关闭文件book.write();book.close();}catch(Exception e){System.out.println(e);}}}编译执行后,会在当前位置产生一个Excel文件。
二、读取文件以刚才我们创建的Excel文件为例,做一个简单的读取操作,程序代码如下://读取Excel的类import java.io.*;import jxl.*;public class ReadXLS{public static void main(String args[]){try{Workbook book=Workbook.getWorkbook(new File(“测试.xls”));//获得第一个工作表对象Sheet sheet=book.getSheet(0);//得到第一列第一行的单元格Cell cell1=sheet.getCell(0,0);String result=cell1.getContents();System.out.println(result);book.close();}catch(Exception e){System.out.println(e);}}}程序执行结果:test三、修改文件利用jExcelAPI可以修改已有的Excel文件,修改Excel文件的时候,除了打开文件的方式不同之外,其他操作和创建Excel是一样的。
下面的例子是在我们已经生成的Excel文件中添加一个工作表://修改Excel的类,添加一个工作表import java.io.*;import jxl.*;import jxl.write.*;public class UpdateXLS{public static void main(String args[]){try{//Excel获得文件Workbook wb=Workbook.getWorkbook(new File(“测试.xls”));//打开一个文件的副本,并且指定数据写回到原文件WritableWorkbook book=Workbook.createWorkbook(new File(“测试.xls”),wb);//添加一个工作表WritableSheet sheet=book.createSheet(“第二页”,1);sheet.addCell(new Label(0,0,”第二页的测试数据”));book.write();book.close();}catch(Exception e){System.out.println(e);}}}高级操作一、数据格式化在Excel中不涉及复杂的数据类型,能够比较好的处理字串、数字和日期已经能够满足一般的应用。
1、字串格式化字符串的格式化涉及到的是字体、粗细、字号等元素,这些功能主要由WritableFont和WritableCellFormat类来负责。
假设我们在生成一个含有字串的单元格时,使用如下语句,为方便叙述,我们为每一行命令加了编号:WritableFont font1= new WritableFont(WritableFont.TIMES,16,WritableFont.BOLD); 或//设置字体格式为excel支持的格式WritableFont font3=new WritableFont(WritableFont.createFont("楷体_GB2312"),12,WritableFont.NO_BOLD );①WritableCellFormat format1=new WritableCellFormat(font1);②Label label=new Label(0,0,”data 4 test”,format1);③其中①指定了字串格式:字体为TIMES,字号16,加粗显示。
WritableFont有非常丰富的构造子,供不同情况下使用,jExcelAPI的java-doc中有详细列表,这里不再列出。
②处代码使用了WritableCellFormat类,这个类非常重要,通过它可以指定单元格的各种属性,后面的单元格格式化中会有更多描述。
③处使用了Label类的构造子,指定了字串被赋予那种格式。
在WritableCellFormat类中,还有一个很重要的方法是指定数据的对齐方式,比如针对我们上面的实例,可以指定://把水平对齐方式指定为居中format1.setAlignment(jxl.format.Alignment.CENTRE);//把垂直对齐方式指定为居中format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);//设置自动换行format1.setWrap(true);二、单元格操作Excel中很重要的一部分是对单元格的操作,比如行高、列宽、单元格合并等,所幸jExcelAPI提供了这些支持。
这些操作相对比较简单,下面只介绍一下相关的API。
1、合并单元格WritableSheet.mergeCells(int m,int n,int p,int q);作用是从(m,n)到(p,q)的单元格全部合并,比如:WritableSheet sheet=book.createSheet(“第一页”,0);//合并第一列第一行到第六列第一行的所有单元格sheet.mergeCells(0,0,5,0);合并既可以是横向的,也可以是纵向的。
合并后的单元格不能再次进行合并,否则会触发异常。
2、行高和列宽WritableSheet.setRowView(int i,int height);作用是指定第i+1行的高度,比如://将第一行的高度设为200sheet.setRowView(0,200);WritableSheet.setColumnView(int i,int width);作用是指定第i+1列的宽度,比如://将第一列的宽度设为30sheet.setColumnView(0,30);三、操作图片public static void write()throws Exception{WritableWorkbook wwb=Workbook.createWorkbook(new File("c:/1.xls"));WritableSheet ws=wwb.createSheet("Test Sheet 1",0);File file=new File("C:\\jbproject\\PVS\\WebRoot\\weekhit\\1109496996281.png");WritableImage image=new WritableImage(1, 4, 6, 18,file);ws.addImage(image);wwb.write();wwb.close();}很简单和插入单元格的方式一样,不过就是参数多了些,WritableImage这个类继承了Draw,上面只是他构造方法的一种,最后一个参数不用说了,前面四个参数的类型都是double,依次是x, y, width, height,注意,这里的宽和高可不是图片的宽和高,而是图片所要占的单位格的个数,因为继承的Draw所以他的类型必须是double,具体里面怎么实现的我还没细看:)因为着急赶活,先完成功能,其他的以后有时间慢慢研究。