JAVA导出EXCEL类(TSV格式)
java自定义注解在excel导出时的使用

java自定义注解在excel导出时的使用在Java中,自定义注解是一种用于在程序中进行标记的机制。
通过定义自己的注解,可以为类、方法、字段等元素添加元数据,用于描述它们的特性和行为。
在Excel导出时,自定义注解可以用来定义导出的字段和格式,并且可以通过反射机制来读取注解信息,实现自动导出的功能。
下面是一个简单的自定义注解示例:```javaimport ng.annotation.*;String name( default ""; // 导出字段的名称int width( default 20; // 导出字段的宽度String format( default ""; // 导出字段的格式```定义了注解之后,可以在需要导出的类中使用该注解对字段进行标记。
例如:```javapublic class Userprivate String name;private int age;//其他字段和方法...```接下来,可以编写一个用于导出Excel的工具类。
该类可以使用反射来读取类的字段和注解信息,并根据注解信息生成相应的Excel文件。
以下是一个简单的Excel导出工具类示例:```javapublic class ExcelExportUtilpublic static <T> void exportToExcel(List<T> data, Class<T> clazz, String filePath)//创建工作簿和工作表Workbook workbook = new HSSFWorkbook(;Sheet sheet = workbook.createSheet("Sheet1");//获取类的字段和注解信息Field[] fields = clazz.getDeclaredFields(;for (int i = 0; i < fields.length; i++)Field field = fields[i];ExcelField excelField =field.getAnnotation(ExcelField.class);if (excelField != null)//获取注解信息String fieldName = (;int width = excelField.width(;//设置列宽sheet.setColumnWidth(i, width * 256);//创建表头单元格Row headerRow = sheet.getRow(0);if (headerRow == null)headerRow = sheet.createRow(0);}Cell headerCell = headerRow.createCell(i); headerCell.setCellValue(fieldName);}}//创建数据行for (int i = 0; i < data.size(; i++)T item = data.get(i);Row dataRow = sheet.getRow(i + 1);if (dataRow == null)dataRow = sheet.createRow(i + 1);}for (int j = 0; j < fields.length; j++)Field field = fields[j];if (field.isAccessible()try//获取字段值Object value = field.get(item);//创建数据单元格并填充数据Cell dataCell = dataRow.createCell(j); if (value instanceof String) dataCell.setCellValue((String) value); } else if (value instanceof Integer) dataCell.setCellValue((int) value);} else if (value instanceof Double) dataCell.setCellValue((double) value); }} catch (IllegalAccessException e)e.printStackTrace(;}}}}// 保存Excel文件try (FileOutputStream outputStream = newFileOutputStream(filePath))workbook.write(outputStream);} catch (IOException e)e.printStackTrace(;}}```在上面的示例中,exportToExcel方法接收一个泛型列表和类的字节码对象,通过反射来读取类的字段和注解信息,并根据注解信息生成Excel文件。
java导出excel浏览器直接下载或者或以文件形式导出

java导出excel浏览器直接下载或者或以⽂件形式导出看代码吧~/*** 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导入导出总结

java excel导入导出总结Java是一种常用的编程语言,它具有很多强大的功能和库,可以用来处理各种各样的任务。
其中之一就是处理Excel文件的导入和导出操作。
在本文中,我们将总结一下Java中如何进行Excel的导入和导出操作,并介绍一些常用的技巧和注意事项。
一、Excel的导入操作在Java中,我们可以使用Apache POI库来进行Excel文件的导入操作。
首先,我们需要在项目中引入Apache POI的相关依赖。
然后,我们可以通过以下步骤来实现Excel的导入:1. 创建一个Workbook对象,用于表示Excel文件。
2. 根据文件路径或输入流创建一个InputStream对象,用于读取Excel文件的内容。
3. 根据文件的扩展名(xls或xlsx),创建一个合适的Workbook实现类的对象。
4. 通过Workbook对象的getSheet()方法获取一个Sheet对象,用于表示Excel文件中的一个工作表。
5. 遍历Sheet对象的每一行和每一列,读取单元格中的数据。
注意事项:- 在读取单元格数据时,我们需要根据单元格的类型来选择合适的读取方法。
例如,如果单元格中的数据是字符串类型,我们可以使用getStringCellValue()方法来读取。
- 在处理日期类型的数据时,我们可以使用DateUtil类来将Excel 中的日期值转换为Java中的Date对象。
- 在遍历行和列时,我们可以使用for循环或迭代器来实现。
二、Excel的导出操作与Excel的导入操作类似,我们同样可以使用Apache POI库来进行Excel文件的导出操作。
下面是导出Excel文件的一般步骤:1. 创建一个Workbook对象,用于表示Excel文件。
2. 创建一个Sheet对象,用于表示Excel文件中的一个工作表。
3. 创建行对象和单元格对象,用于表示Excel文件中的行和单元格。
4. 设置单元格的值和格式。
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程序导出模板和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 避免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类(TSV格式)

package com.bear.util;import java.io.*;import javax.swing.*;import javax.swing.table.*;public class ExcelUtil {public void exportTable(JTable table,String title) throws IOException {TableModel model = table.getModel();JFileChooser fileChooser = new JFileChooser();fileChooser.setCurrentDirectory(new File("."));//设置当前目录fileChooser.setAcceptAllFileFilterUsed(false);fileChooser.addChoosableFileFilter(new javax.swing.filechooser.FileFilter() {public boolean accept(File file) {if (file.isDirectory())return true;return (file.getName().indexOf("xls") != -1);}public String getDescription() {return "Microsoft Excel文件(*.xls)";}});//fileChooser.showSaveDialog(null);int returnVal =fileChooser.showSaveDialog(fileChooser);if (returnVal == JFileChooser.APPROVE_OPTION) {File file = fileChooser.getSelectedFile();if (file.exists()) {int copy = JOptionPane.showConfirmDialog(null,"是否要覆盖当前文件?", "保存", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);if (copy == JOptionPane.YES_OPTION)fileChooser.approveSelection();elsereturn;}elsefileChooser.approveSelection();FileWriter out = new FileWriter(file);out.write(title + "\n\n");for(int i=0; i < model.getColumnCount(); i++)out.write(model.getColumnName(i) + "\t");out.write("\n");for(int i=0; i< model.getRowCount(); i++) {for(int j=0; j < model.getColumnCount(); j++) {out.write(model.getValueAt(i,j).toString()+"\t");}out.write("\n");}out.close();JOptionPane.showMessageDialog(null, "EXCEL文件导出成功!","成功",RMATION_MESSAGE);}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
package com.bear.util;
import java.io.*;
import javax.swing.*;
import javax.swing.table.*;
public class ExcelUtil {
public void exportTable(JTable table,String title) throws IOException {
TableModel model = table.getModel();
JFileChooser fileChooser = new JFileChooser();
fileChooser.setCurrentDirectory(new File("."));//设置当前目录
fileChooser.setAcceptAllFileFilterUsed(false);
fileChooser.addChoosableFileFilter(new javax.swing.filechooser.FileFilter() {
public boolean accept(File file) {
if (file.isDirectory())
return true;
return (file.getName().indexOf("xls") != -1);
}
public String getDescription() {
return "Microsoft Excel文件(*.xls)";
}
});
//fileChooser.showSaveDialog(null);
int returnVal =fileChooser.showSaveDialog(fileChooser);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
if (file.exists()) {
int copy = JOptionPane.showConfirmDialog(null,"是否要覆盖当前文件?", "保存", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);
if (copy == JOptionPane.YES_OPTION)
fileChooser.approveSelection();
else
return;
}
else
fileChooser.approveSelection();
FileWriter out = new FileWriter(file);
out.write(title + "\n\n");
for(int i=0; i < model.getColumnCount(); i++)
out.write(model.getColumnName(i) + "\t");
out.write("\n");
for(int i=0; i< model.getRowCount(); i++) {
for(int j=0; j < model.getColumnCount(); j++) {
out.write(model.getValueAt(i,j).toString()+"\t");
}
out.write("\n");
}
out.close();
JOptionPane.showMessageDialog(null, "EXCEL文件导出成功!","成功",RMATION_MESSAGE);
}
}
}。