1.使用POI
引入jar包
<!-- poi HSSF is our port of the Microsoft Excel 97(-2007) file format (BIFF8) to pure Java. --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <!-- poi-ooxml XSSF is our port of the Microsoft Excel XML (2007+) file format (OOXML) to pure Java --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.17</version> </dependency>
ExcelExport.java
import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.VerticalAlignment; import org.apache.poi.ss.util.CellRangeAddress; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; /** * @author Sue * @create 2019-04-29 14:38 **/ @Controller public class ExcelExport { @RequestMapping(value = "/execute", method = RequestMethod.GET) public void execute(HttpServletRequest request, HttpServletResponse response) throws IOException { //待导出的数据 List<ReportInfo> reportInfoList = new ArrayList<>(); reportInfoList.add(new ReportInfo("上海卡部", "this week 01", "next week 01")); reportInfoList.add(new ReportInfo("广州卡部", "this week 05", "next week 05")); reportInfoList.add(new ReportInfo("厦门卡部", "this week 05", "next week 05")); reportInfoList.add(new ReportInfo("宁波卡部", "this week 05", "next week 05")); reportInfoList.add(new ReportInfo("武汉卡部", "this week 05", "next week 05")); // 导出.xlsx文件使用这个对象 // XSSFWorkbook work = null; HSSFWorkbook workbook = null; try { //创建一个空白的workbook workbook = new HSSFWorkbook(); //建立新的sheet对象(excel的表单) HSSFSheet sheet = workbook.createSheet("周报信息表"); //在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个 HSSFRow row1 = sheet.createRow(0); //创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何一个 HSSFCell cell = row1.createCell(0); //创建样式 HSSFCellStyle cellStyle = workbook.createCellStyle(); //水平居中 cellStyle.setAlignment(HorizontalAlignment.CENTER); //垂直居中 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); //设置单元格样式 cell.setCellStyle(cellStyle); //设置单元格内容 cell.setCellValue("周报信息一览表"); //合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列 sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3)); //在sheet里创建第二行 HSSFRow row2 = sheet.createRow(1); //创建单元格并设置单元格内容 row2.createCell(0).setCellValue("业务条线"); row2.createCell(1).setCellValue("本周工作成果"); row2.createCell(2).setCellValue("下周工作计划"); //在sheet里创建第三行 HSSFCellStyle cellStyle1 = workbook.createCellStyle(); //自动换行 cellStyle1.setWrapText(true); for (int i = 0; i < reportInfoList.size(); i++) { HSSFRow row = sheet.createRow(2 + i); HSSFCell cell0 = row.createCell(0); cell0.setCellStyle(cellStyle1); cell0.setCellValue(reportInfoList.get(i).getName()); HSSFCell cell1 = row.createCell(1); cell1.setCellStyle(cellStyle1); cell1.setCellValue(reportInfoList.get(i).getThisWeek()); HSSFCell cell2 = row.createCell(2); cell2.setCellStyle(cellStyle1); cell2.setCellValue(reportInfoList.get(i).getNextWeek()); } //输出Excel文件 response.reset(); response.setContentType("application/octet-stream;charset=utf-8"); String fileName = "周报信息导出表" + ".xls"; OutputStream os = response.getOutputStream(); response.reset();//清空输出流 String finalFileName = URLEncoder.encode(fileName, "UTF8"); //这里设置一下让浏览器弹出下载提示框,而不是直接在浏览器中打开 response.setHeader("Content-Disposition", "attachment; filename=\"" + finalFileName + "\""); response.setContentType("application/vnd.ms-excel"); workbook.write(os); os.close(); } catch (IOException e) { throw new IOException(); } finally { if (workbook != null) { workbook.close(); } } } }
ReportInfo.java
/** * @author Sue * @create 2019-04-29 14:47 **/ public class ReportInfo { private String name; private String thisWeek; private String nextWeek; public ReportInfo(String name, String thisWeek, String nextWeek) { this.name = name; this.thisWeek = thisWeek; this.nextWeek = nextWeek; } public ReportInfo() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getThisWeek() { return thisWeek; } public void setThisWeek(String thisWeek) { this.thisWeek = thisWeek; } public String getNextWeek() { return nextWeek; } public void setNextWeek(String nextWeek) { this.nextWeek = nextWeek; } }
访问IP测试
2.使用JXL
引入jar包
<!-- https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl --> <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifactId>jxl</artifactId> <version>2.6.12</version> </dependency>
TestExcel.java
import jxl.Workbook; import jxl.format.Alignment; import jxl.format.VerticalAlignment; import jxl.write.Label; import jxl.write.WritableCellFormat; import jxl.write.WritableFont; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; import jxl.write.biff.JxlWriteException; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @author Sue * @create 2019-04-29 10:39 **/ @RestController public class TestExcel { /** * 测试 导出xls文件的表头 */ public static final String[] TestToXls = {"编号", "设计人员工号", "设计人员姓名", "开发人员工号", "开发人员姓名", "测试人员工号", "测试人员姓名"}; @GetMapping("/test") public void toExcel(HttpServletResponse response, HttpServletRequest request) throws Exception { List<Test> listTest = new ArrayList<Test>(); Test test = new Test("1", "01", "001", "0001", "00001", "000001", "0000001"); listTest.add(test); //这里为导出文件存放的路径 String filePath = "D:\\sheet\\"; //加入一个uuid随机数是因为 //每次导出的时候,如果文件存在了,会将其覆盖掉,这里是保存所有的文件 File file = new File(filePath); if (!file.exists()) { file.mkdirs(); } SimpleDateFormat fmt = new SimpleDateFormat("yyyy年MM月dd HH时mm分ss秒"); // 给要导出的文件起名为 "测试导出数据表_时间.xls" String filePath2 = filePath + "数据表" + "-" + fmt.format(new Date()) + ".xls"; WritableWorkbook wb = null; try { File file2 = new File(filePath2); if (!file2.exists()) {//不存在,创建 file2.createNewFile(); } wb = Workbook.createWorkbook(file2);//创建xls表格文件 // 表头显示 WritableCellFormat wcf = new WritableCellFormat(); wcf.setAlignment(Alignment.CENTRE);// 水平居中 wcf.setWrap(true); wcf.setVerticalAlignment(VerticalAlignment.CENTRE);// 垂直居中 wcf.setFont(new WritableFont(WritableFont.TIMES, 13, WritableFont.BOLD));// 表头字体 加粗 13号 wcf.setBackground(jxl.format.Colour.PERIWINKLE); // 内容显示 WritableCellFormat wcf2 = new WritableCellFormat(); wcf2.setWrap(true);//设置单元格可以换行 wcf2.setAlignment(Alignment.CENTRE);//水平居中 wcf2.setVerticalAlignment(VerticalAlignment.CENTRE);// 垂直居中 wcf2.setFont(new WritableFont(WritableFont.TIMES, 11));// 内容字体 11号 //导出的xls的第一页,第二页就是0换成1,“sheet1”,也可以修改为自己想要的显示的内容 WritableSheet ws = wb.createSheet("sheet1", 0); //WritableSheet ws2 = wb.createSheet("sheet2", 1);//第2个sheet页 ws.addCell(new Label(0, 0, "导出结果"));//代表着表格中第一列的第一行显示查询结果几个字 // 导出时生成表头 for (int i = 0; i < TestToXls.length; i++) { //i,代表的第几列,1,代表第2行,第三个参数为要显示的内容,第四个参数,为内容格式设置(按照wcf的格式显示) ws.addCell(new Label(i, 1, TestToXls[i], wcf));//在sheet1中循环加入表头 } int k = 2;//从第三行开始写入数据 for (int i = 0; i < listTest.size(); i++) { ws.addCell(new Label(0, k, listTest.get(i).getIdd(), wcf2)); ws.addCell(new Label(1, k, listTest.get(i).getDesignId(), wcf2)); ws.addCell(new Label(2, k, listTest.get(i).getDesignName(), wcf2)); ws.addCell(new Label(3, k, listTest.get(i).getDevelopId(), wcf2)); ws.addCell(new Label(4, k, listTest.get(i).getDevelopName(), wcf2)); ws.addCell(new Label(5, k, listTest.get(i).getTestId(), wcf2)); ws.addCell(new Label(6, k, listTest.get(i).getTestName(), wcf2)); //ws.mergeCells(4, 5, 5, 5);//合并两列,按参数顺序,意思是第4列的第五行,跟第五列的第五行合并为一个单元格 k++; } wb.write();//写入,到这里已经生成完成,可以在相应目录下找到刚才生成的文件 } catch (IOException e) { e.printStackTrace(); } catch (JxlWriteException e) { e.printStackTrace(); } catch (WriteException e) { e.printStackTrace(); } finally { try { if (wb != null) { wb.close(); } } catch (WriteException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //这个是我们项目中,是把刚才生成的文件,响应到前台,进行下载、保存,可省略。 downLoadFile(filePath2, response); } public void downLoadFile(String filePath, HttpServletResponse response) { SimpleDateFormat fmt = new SimpleDateFormat("yyyy年MM月dd HH时mm分ss秒"); FileInputStream in = null; ServletOutputStream out = null; BufferedOutputStream toOut = null; String fileName = "导出数据表" + "-" + fmt.format(new Date()) + ".xls"; try { in = new FileInputStream(new File(filePath)); byte[] buffer = new byte[in.available()]; while (in.read(buffer) != -1) { // HttpServletResponse response = this.getContext().getResponse();//从application中得到response response.reset();// 清空 // 设置响应的文件的头文件格式 response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("UTF-8"), "iso-8859-1")); // response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("GBK"), "ISO8859-1")); response.addHeader("Content-type", "application-download"); // 获取响应的对象流 out = response.getOutputStream(); toOut = new BufferedOutputStream(out); toOut.write(buffer); toOut.flush(); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (in != null) { in.close(); } if (out != null) { out.close(); } if (toOut != null) { toOut.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
Test.java
/** * @author Sue * @create 2019-04-29 10:41 **/ public class Test { private String idd;//编号 private String designId;//设计人员工号 private String designName;//设计人员姓名 private String developId;//开发人员工号 private String developName;//开发人员姓名 private String testId;//测试人员工号 private String testName;//测试人员姓名 public Test(String idd, String designId, String designName, String developId, String developName, String testId, String testName) { this.idd = idd; this.designId = designId; this.designName = designName; this.developId = developId; this.developName = developName; this.testId = testId; this.testName = testName; } public Test() { } public String getIdd() { return idd; } public void setIdd(String idd) { this.idd = idd; } public String getDesignId() { return designId; } public void setDesignId(String designId) { this.designId = designId; } public String getDesignName() { return designName; } public void setDesignName(String designName) { this.designName = designName; } public String getDevelopId() { return developId; } public void setDevelopId(String developId) { this.developId = developId; } public String getDevelopName() { return developName; } public void setDevelopName(String developName) { this.developName = developName; } public String getTestId() { return testId; } public void setTestId(String testId) { this.testId = testId; } public String getTestName() { return testName; } public void setTestName(String testName) { this.testName = testName; } }
访问IP测试即可