1.关于Excel版本的一点了解

在项目工作中主要使用两个版本,03版文件名以“.xls”结尾,最大处理行数为65536,07版文件名以“.xlsx”结尾,最大处理行数为1048576。

2.关于Excel的相关概念

工作簿 工作表 行 单元格

3.POI版本使用3.11,创建maven工程方便导入jar包

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.11</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.11</version></dependency>

4.POI操作Excel工作簿的三个实现类(实现接口Workbook)

POI处理不同需求的Excel操作有不同的实现类,03版的xls对应HSSFWorkbook,07版的xlsx对应XSSFWorkbook,大数据量的写操作使用SXSSFWorkbook,大概的区别就是HSSFWorkbook读取的最大行数是65536,读写的速度相对较快,但存在弊端,不能写更多行的数据,这时候XSSFWorkbook登场,但是XSSFWorkbook采用一次性写出数据,如果数据量很大内存又不够,容易造成OOM异常,而SXSSFWorkbook使用了滑动窗口的概念,默认在内存中最多保留100行数据,超过100行的时候,就会把最小索引的行写入到临时文件中,这样就可以尽可能的避免出现OOM异常,大家根据实际需求选择相应的实现类。本次讲解使用HSSFWorkbook

5.HSSFWorkbook常用类与Excel对象的对应关系

HSSFWorkbook 工作簿对象
HSSFSheet 工作表对象
HSSFRow 行对象
HSSFCell 单元格对象
HSSFCellStyle 单元格样式对象
HSSFFont 字体对象

6.生成没有单元格边框的表头

在Excel里面默认的边框线是灰色的,生成没有边框线的单元格的逻辑就是想边框线的颜色改为白色,由于是演示代码,有些冗余代码没有提取出来,大家自行根据需求进行处理。

    public static void setSheetHead() {// 文件路径,03版的文件名以.xls结尾,07版的文件名以.xlsx结尾String filePath = "/Users/lavined/Desktop/test01.xls";FileOutputStream os = null;// 最大列数int cellNum = 10;int cellNumTemp = cellNum - 1;// 工作表名称String sheetName = "学生信息表";// 创建工作簿对象Workbook workbook = new HSSFWorkbook();// 创建工作表对象Sheet sheet = workbook.createSheet(sheetName);// 设置列宽sheet.setDefaultColumnWidth(13);// 设置单元格格式CellStyle cellStyle = workbook.createCellStyle();// 边框颜色白色cellStyle.setTopBorderColor(IndexedColors.WHITE.getIndex());cellStyle.setLeftBorderColor(IndexedColors.WHITE.getIndex());cellStyle.setRightBorderColor(IndexedColors.WHITE.getIndex());cellStyle.setBottomBorderColor(IndexedColors.WHITE.getIndex());// 边框线型cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框// 由于采用无边框样式以后,最后一个单元格的右边框会消失,所以给最后一个单元格的下一个单元格设置样式CellStyle leftCellStyle = workbook.createCellStyle();leftCellStyle.setLeftBorderColor(IndexedColors.GREY_25_PERCENT.getIndex());leftCellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 内容居中cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置字体Font font = workbook.createFont();font.setBold(true);// 粗体font.setFontHeightInPoints((short) 14);// 设置字体大小cellStyle.setFont(font);// 创建行对象Row row = sheet.createRow(0);for (int i = 0; i < cellNum; i++) {// 创建单元格对象Cell cell = row.createCell(i);if (i == 0) {cell.setCellValue(sheetName);}// 设置单元格样式cell.setCellStyle(cellStyle);}row.createCell(cellNum).setCellStyle(leftCellStyle);// 合并单元格CellRangeAddress region1 = new CellRangeAddress(0, 0, 0, cellNumTemp);sheet.addMergedRegion(region1);// 空一行sheet.createRow(1);CellRangeAddress region2 = new CellRangeAddress(1, 1, 0, cellNumTemp);sheet.addMergedRegion(region2);// 第二级表头Row sheetRow2 = sheet.createRow(2);int lastRemarkCellNum = cellNum - 3;for (int i = 0; i < cellNum; i++) {Cell cell = sheetRow2.createCell(i);if (i == 0) {cell.setCellValue("班级:三年级一班");}if (i == 3) {cell.setCellValue("人数:10人");}if (i == lastRemarkCellNum) {cell.setCellValue("创建时间:2021-03-01 17:09:47");}// 设置单元格样式cell.setCellStyle(cellStyle);}sheetRow2.createCell(cellNum).setCellStyle(leftCellStyle);// 合并单元格CellRangeAddress region3 = new CellRangeAddress(2, 2, 0, 2);sheet.addMergedRegion(region3);CellRangeAddress region4 = new CellRangeAddress(2, 2, 3, lastRemarkCellNum -1);sheet.addMergedRegion(region4);CellRangeAddress region5 = new CellRangeAddress(2, 2, lastRemarkCellNum, cellNumTemp);sheet.addMergedRegion(region5);sheet.createRow(3);CellRangeAddress region6 = new CellRangeAddress(3, 3, 0, cellNumTemp);sheet.addMergedRegion(region6);// 以流的方式写出文件try {os = new FileOutputStream(filePath);workbook.write(os);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}}

代码结果如下:

7.生成带背景色的数据表头

public static void setDataHead(){String filePath = "/Users/lavined/Desktop/test01.xls";FileOutputStream os = null;// 工作表名称String sheetName = "学生信息表";// 创建工作簿对象Workbook workbook = new HSSFWorkbook();// 创建工作表对象Sheet sheet = workbook.createSheet(sheetName);// 设置列宽sheet.setDefaultColumnWidth(13);// 设置单元格格式CellStyle cellStyle = workbook.createCellStyle();// 内容居中cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 背景色cellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);// 边框颜色 黑色cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());// 边框线型cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框// 数据表头字段Map<Integer,String> dataHeadMap = new HashMap<>();dataHeadMap.put(0, "班级");dataHeadMap.put(1, "姓名");dataHeadMap.put(2, "性别");dataHeadMap.put(3, "年龄");dataHeadMap.put(4, "身高");dataHeadMap.put(5, "体重");dataHeadMap.put(6, "家庭地址");dataHeadMap.put(7, "饭卡余额");dataHeadMap.put(8, "备注1");dataHeadMap.put(9, "备注2");// 报表数据项表头样式Row row = sheet.createRow(0);if (dataHeadMap != null) {for (Map.Entry<Integer, String> headMap : dataHeadMap.entrySet()) {Cell cell = row.createCell(headMap.getKey());cell.setCellValue(headMap.getValue());if (null != cellStyle) {cell.setCellStyle(cellStyle);}}}// 以流的方式写出文件try {os = new FileOutputStream(filePath);workbook.write(os);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}}

代码结果

8.生成数据内容

8.1在生成数据内容的时候,如果是类似数据表头的形式,则可以利用Map<Integer,String>让key的值和列的顺序保持一致,value为单元格内容,参照数据表头的内容;
8.2可以采用反射的方式生成数据内容,定义一个对象并提供set,get方法,属性的类型尽量是字符串类型(在使用反射的时候,如果属性内容为空,则会有默认值,与实际情况不符),对象的属性和Excel列的顺序保持一致。
8.2.1定义对象

public class Student {private String className;private String name;private String sex;private int age;private double height;private double weight;private String address;private BigDecimal amount;private String remark1;private String remark2;public String getClassName() {return className;}public void setClassName(String className) {this.className = className;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}public double getWeight() {return weight;}public void setWeight(double weight) {this.weight = weight;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public BigDecimal getAmount() {return amount;}public void setAmount(BigDecimal amount) {this.amount = amount;}public String getRemark1() {return remark1;}public void setRemark1(String remark1) {this.remark1 = remark1;}public String getRemark2() {return remark2;}public void setRemark2(String remark2) {this.remark2 = remark2;}
}

8.2.2设置数据公共方法

 /*** 设置单元格内容List** @param sheet 工作表对象* @param beginRow 数据从第几行开始* @param dataList 数据集合* @param dataStyle 数据样式* @return*/public static void setDataList(Sheet sheet, int beginRow, Collection dataList, CellStyle dataStyle) {if (dataList != null) {Iterator iterator = dataList.iterator();while (iterator.hasNext()) {Row row = sheet.createRow(beginRow);beginRow++;Object t = iterator.next();// 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值Field[] fields = t.getClass().getDeclaredFields();try {for (short i = 0; i < fields.length; i++) {Cell cell = row.createCell(i);Field field = fields[i];field.setAccessible(true);String fieldName = field.getName();String getMethodName = "get"+ fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);Class clazz = t.getClass();Method method = clazz.getMethod(getMethodName, null);Object cellValue = method.invoke(t, null);if (cellValue instanceof BigDecimal) {DecimalFormat df1 = new DecimalFormat("##,##0.00");cell.setCellValue(df1.format(cellValue));} else if (cellValue instanceof Integer) {cell.setCellValue(Integer.valueOf(cellValue.toString()));} else if(cellValue instanceof Double){cell.setCellValue(Double.parseDouble(String.valueOf(cellValue)));}else {cell.setCellValue(String.valueOf(cellValue));}cell.setCellStyle(dataStyle);}} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}}}

8.2.3数据表头和数据整体代码

 public static void setDataHead(){String filePath = "/Users/lavined/Desktop/test01.xls";FileOutputStream os = null;// 工作表名称String sheetName = "学生信息表";// 创建工作簿对象Workbook workbook = new HSSFWorkbook();// 创建工作表对象Sheet sheet = workbook.createSheet(sheetName);// 设置列宽sheet.setDefaultColumnWidth(13);// 设置单元格格式CellStyle cellStyle = workbook.createCellStyle();// 内容居中cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 背景色cellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);// 边框颜色 黑色cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());// 边框线型cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框// 数据表头字段Map<Integer,String> dataHeadMap = new HashMap<>();dataHeadMap.put(0, "班级");dataHeadMap.put(1, "姓名");dataHeadMap.put(2, "性别");dataHeadMap.put(3, "年龄");dataHeadMap.put(4, "身高");dataHeadMap.put(5, "体重");dataHeadMap.put(6, "家庭地址");dataHeadMap.put(7, "饭卡余额");dataHeadMap.put(8, "备注1");dataHeadMap.put(9, "备注2");// 报表数据项表头样式Row row = sheet.createRow(0);if (dataHeadMap != null) {for (Map.Entry<Integer, String> headMap : dataHeadMap.entrySet()) {Cell cell = row.createCell(headMap.getKey());cell.setCellValue(headMap.getValue());if (null != cellStyle) {cell.setCellStyle(cellStyle);}}}// 数据内容List dataList = new ArrayList();Student student = new Student();student.setClassName("三年级一班");student.setName("姓名");student.setSex("男");student.setAge(10);student.setHeight(120.3);student.setWeight(40.2);student.setAddress("xx省xx市xx县");student.setAmount(new BigDecimal("1000.3"));student.setRemark1("备注111111");student.setRemark2("备注222222");for (int i = 0; i < 20; i++) {dataList.add(student);}// 数据居中CellStyle dataCellStyle = workbook.createCellStyle();dataCellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);dataCellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);setDataList(sheet,1,dataList,dataCellStyle);// 以流的方式写出文件try {os = new FileOutputStream(filePath);workbook.write(os);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}}

8.2.3结果

9.整体代码(里面有冗余代码,根据需要自行提取方法)

 public static void writeToExcel(){// 文件路径,03版的文件名以.xls结尾,07版的文件名以.xlsx结尾String filePath = "/Users/lavined/Desktop/test01.xls";FileOutputStream os = null;// 最大列数int cellNum = 10;int cellNumTemp = cellNum - 1;// 工作表名称String sheetName = "学生信息表";// 创建工作簿对象Workbook workbook = new HSSFWorkbook();// 创建工作表对象Sheet sheet = workbook.createSheet(sheetName);// 设置列宽sheet.setDefaultColumnWidth(13);// 设置单元格格式CellStyle cellStyle = workbook.createCellStyle();// 边框颜色白色cellStyle.setTopBorderColor(IndexedColors.WHITE.getIndex());cellStyle.setLeftBorderColor(IndexedColors.WHITE.getIndex());cellStyle.setRightBorderColor(IndexedColors.WHITE.getIndex());cellStyle.setBottomBorderColor(IndexedColors.WHITE.getIndex());// 边框线型cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框// 由于采用无边框样式以后,最后一个单元格的右边框会消失,所以给最后一个单元格的下一个单元格设置样式CellStyle leftCellStyle = workbook.createCellStyle();leftCellStyle.setLeftBorderColor(IndexedColors.GREY_25_PERCENT.getIndex());leftCellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 内容居中cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置单元格格式CellStyle cellStyle1 = workbook.createCellStyle();// 内容居中cellStyle1.setAlignment(HSSFCellStyle.ALIGN_CENTER);cellStyle1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 背景色cellStyle1.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());cellStyle1.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);// 边框颜色 黑色cellStyle1.setTopBorderColor(IndexedColors.BLACK.getIndex());cellStyle1.setLeftBorderColor(IndexedColors.BLACK.getIndex());cellStyle1.setRightBorderColor(IndexedColors.BLACK.getIndex());cellStyle1.setBottomBorderColor(IndexedColors.BLACK.getIndex());// 边框线型cellStyle1.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框cellStyle1.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框cellStyle1.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框cellStyle1.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框// 设置字体Font font = workbook.createFont();font.setBold(true);// 粗体font.setFontHeightInPoints((short) 14);// 设置字体大小cellStyle.setFont(font);// 创建行对象Row row = sheet.createRow(0);for (int i = 0; i < cellNum; i++) {// 创建单元格对象Cell cell = row.createCell(i);if (i == 0) {cell.setCellValue(sheetName);}// 设置单元格样式cell.setCellStyle(cellStyle);}row.createCell(cellNum).setCellStyle(leftCellStyle);// 合并单元格CellRangeAddress region1 = new CellRangeAddress(0, 0, 0, cellNumTemp);sheet.addMergedRegion(region1);// 空一行sheet.createRow(1);CellRangeAddress region2 = new CellRangeAddress(1, 1, 0, cellNumTemp);sheet.addMergedRegion(region2);// 第二级表头Row sheetRow2 = sheet.createRow(2);int lastRemarkCellNum = cellNum - 3;for (int i = 0; i < cellNum; i++) {Cell cell = sheetRow2.createCell(i);if (i == 0) {cell.setCellValue("班级:三年级一班");}if (i == 3) {cell.setCellValue("人数:10人");}if (i == lastRemarkCellNum) {cell.setCellValue("创建时间:2021-03-01 17:09:47");}// 设置单元格样式cell.setCellStyle(cellStyle);}sheetRow2.createCell(cellNum).setCellStyle(leftCellStyle);// 合并单元格CellRangeAddress region3 = new CellRangeAddress(2, 2, 0, 2);sheet.addMergedRegion(region3);CellRangeAddress region4 = new CellRangeAddress(2, 2, 3, lastRemarkCellNum -1);sheet.addMergedRegion(region4);CellRangeAddress region5 = new CellRangeAddress(2, 2, lastRemarkCellNum, cellNumTemp);sheet.addMergedRegion(region5);sheet.createRow(3);CellRangeAddress region6 = new CellRangeAddress(3, 3, 0, cellNumTemp);sheet.addMergedRegion(region6);// 数据表头字段Map<Integer,String> dataHeadMap = new HashMap<>();dataHeadMap.put(0, "班级");dataHeadMap.put(1, "姓名");dataHeadMap.put(2, "性别");dataHeadMap.put(3, "年龄");dataHeadMap.put(4, "身高");dataHeadMap.put(5, "体重");dataHeadMap.put(6, "家庭地址");dataHeadMap.put(7, "饭卡余额");dataHeadMap.put(8, "备注1");dataHeadMap.put(9, "备注2");// 报表数据项表头样式Row row1 = sheet.createRow(4);if (dataHeadMap != null) {for (Map.Entry<Integer, String> headMap : dataHeadMap.entrySet()) {Cell cell = row1.createCell(headMap.getKey());cell.setCellValue(headMap.getValue());if (null != cellStyle) {cell.setCellStyle(cellStyle1);}}}// 数据内容List dataList = new ArrayList();Student student = new Student();student.setClassName("三年级一班");student.setName("姓名");student.setSex("男");student.setAge(10);student.setHeight(120.3);student.setWeight(40.2);student.setAddress("xx省xx市xx县");student.setAmount(new BigDecimal("1000.3"));student.setRemark1("备注111111");student.setRemark2("备注222222");for (int i = 0; i < 20; i++) {dataList.add(student);}// 数据居中CellStyle dataCellStyle = workbook.createCellStyle();dataCellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);dataCellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);setDataList(sheet,5,dataList,dataCellStyle);// 以流的方式写出文件try {os = new FileOutputStream(filePath);workbook.write(os);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}}

9.1整体效果

10测试对比

10.1不同版本最大行,最大列

10.1.2超过最大行列则报错

10.2XSSFWorkbook与SXSSFWorkbook效率对比
07版本50万条10秒
07S版本50万条1秒
差别还是有的。

利用POI生成带表头的Excel相关推荐

  1. 利用POI生成EXCEL报表(通过web页面导出后台数据)

    很多时候需要将数据利用浏览器进行导出,这个时候我们就可以采用Apache的POI进行实现通过web页面实现Excel导出后台数据,并且以.xlsx的形式下载到本地,也就是excel表格形式. 首先先下 ...

  2. VUE Table复杂表格生成带格式的excel(多表头、合并单元格、边框、居中、背景)

    VUE Table复杂表格生成带格式的excel(多表头.合并单元格.边框.居中.背景) 因为工作需要,在网上找了很多都不太行无意之间看到一个大佬的打码拿过来改了改居然可以用! 原文链接:https: ...

  3. Java利用poi生成word(包含插入图片,动态表格,行合并)

    Java利用poi生成word(包含插入图片,动态表格,行合并) 测试模板样式: 图表 1 Word生成结果: 图表 2 需要的jar包:(具体jar可自行去maven下载) Test测试类: imp ...

  4. 利用freemarker生成带fusioncharts图片的word简报

    /**  * 利用freemarker生成带fusioncharts图片的word简报  *         烟台海颐软件技术论坛  *         作者  牟云飞 新建 *         毕业 ...

  5. java poi 生成excel_利用POI生成EXCEL文件的方法实例

    一.背景 Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API.用它可以使用Java读取和创建,修 ...

  6. 利用poi实现table表格导出excel

    思路:把table转成json数据传到后台(需要用到jquery.tabletojson.min.js),json转成list<list<String>>类型.利用poi导出e ...

  7. java 动态表头_java如何生成可变表头的excel

    本文为大家分享了java生成可变表头excel的具体步骤,供大家参考,具体内容如下 1.实现功能: 传入一个表头和数据,将数据导入到excel中. 为了便于项目的扩展,数据传入通过泛型集合传入,获取数 ...

  8. python生成带超链接的excel表格

    前提:项目里已经有函数功能将数据库数据生成excel表格 需求:将现有的excel表格数值覆盖为url超链接 利用pandas直接写入 优点: 省事,只要把数值用原始的excel函数 =HYPERLI ...

  9. Java 调用Poi 生成费用报销单Excel

    整个代码有点多,并没有做优化.目前只是为了功能实现.可以直接复制,创建main方法运行 默认一张A4纸,可以存放2个报销单模板. 如果只想一张A4纸,存放一个报销单.可以从分割线以下代码删除掉.其对应 ...

最新文章

  1. 性能更好的js动画实现方式——requestAnimationFrame
  2. 基本数据结构—Hash哈希
  3. proxool配置详解
  4. ES6 WeakSet数据结构 与Set十分相似
  5. 【拯救赵明】全面防护网络***服务器负载及安全解决方案
  6. IT围城,你是想挤进来还是想离开
  7. python模拟登录页面下载_Python爬虫实战入门四:使用Cookie模拟登录——获取电子书下载链接...
  8. 计算机中2的四次方为啥是4位,计算机基础试题2(4页)-原创力文档
  9. poh用计算机,诚实性证明POH:可验证计算的可实现概率解
  10. BeyondCompare3 提示许可证密钥已被撤销解决方法
  11. 网络安全应急响应(文末附应急工具)
  12. 解决word或wps删除空白页后页面布局变乱
  13. DZY Loves Math系列
  14. JAVA+Appium 自动化实现手机屏幕滑动点击操作
  15. Ubuntu 18 安装截图工具 flameshot
  16. 苹果手机永久删除的照片怎么恢复?
  17. 在VS中给源文件用文件夹分类/在VS中变更源文件路径
  18. 修复iPhone手机白苹果
  19. mysql 删除的三种方法_mysql 删除表数据的三种方法
  20. 你的故事有毒php源码,微信2018你的故事有毒生成器下载

热门文章

  1. 什么样的云计算服务,才能为企业“出海”保驾护航?
  2. goquery爬虫Boss直聘信息
  3. node.js+uniapp计算机毕业设计安卓基于Android的手机点餐App系统(程序+APP+LW)
  4. c/c++图形化(1)
  5. 关于阅读文章技巧的探讨
  6. MBG真香 Spring Boot集成Mybatis Generator插件
  7. 损失函数(Loss function)、代价函数(成本函数)(Cost function)、目标函数(objective function)的区别与联系
  8. 三种常用的直线裁剪算法
  9. MyBatis的example的用法
  10. python 爬取直播弹幕视频_Python爬取b站任意up主所有视频弹幕