excel表格到word格式不对
工作中可能不同的人有不同的操作习惯,有些同学喜欢将Word文档内容复制粘贴导入到Excel当中。在导入的过程中经常会出现一个尴尬的情况,那就是导入Excel后,表格中显示的文档内容格式总是错乱的。如上...
2024.11.20POI概述:
Jakarta POI 是一套用于访问微软格式文档的Java API。POI提供API给Java程序对Microsoft Office格式档案读和写的功能。在许多企业办公系统中,经常会有用户要求,需要对数据进行统计并且可以直接下载Excel文件。
HSSF - 提供读写Microsoft Excel格式档案的功能。XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。HWPF - 提供读写Microsoft Word格式档案的功能。HSLF - 提供读写Microsoft PowerPoint格式档案的功能。HDGF - 提供读写Microsoft Visio格式档案的功能区别不止这些,详细信息可自行百度。
基本步骤:
1、用HSSFWorkbook打开或者创建“Excel文件对象”
2、用HSSFWorkbook对象返回或者创建Sheet对象
3、用Sheet对象返回行对象,用行对象得到Cell对象
4、对Cell对象读写。
5、将生成的HSSFWorkbook放入HttpServletResponse中响应到前端页面
POI依赖:
org.apache.poipoi3.17org.apache.poipoi-ooxml3.17还有其他版本类型的依赖,根据自己需要选择。
代码:
/** * 下载Map类型数据的公共方法 EXCEL * @param mapList 需要导出的数据 * @param templateCode 模板名称或文件地址 * @param dateKey 字段名及对应的列 * @param count 开始放入数据的行 * @param fileName 下载文件名 * @param response response */public void exportUtil(List mapList, String templateCode, Map dateKey, String fileName, int count, HttpServletResponse response) {//从微服务下载模板//FileTeplResVo teplResVo = fileTemplateApi.queryFileId(ModuleConstant.MARKET, templateCode);//String fileId = teplResVo.getFileId();//FileVo fileVo = fileUploadApi.downLoad(fileId, ModuleConstant.MARKET, AuthUtil.getUserId(), false);//获取文件模板try (InputStream inStream = this.getClass().getResourceAsStream(templateCode);OutputStream outputStream = response.getOutputStream(); XSSFWorkbook wb = new XSSFWorkbook(inStream)) {//设置response属性this.setResponse(response, Optional.ofNullable(fileName).orElse("my.xlsx"));//读取了模板第一个sheet页XSSFSheet sheet = wb.getSheetAt(InternalNumConstant.ZERO);//样式XSSFCellStyle cellStyle = this.getCellStyle(wb);Row rowTemp;//循环数据的行for (Map item : mapList) {rowTemp = sheet.createRow(count);//循环列for (Map.Entry item1 : dateKey.entrySet()) {// 设置单元格内容rowTemp.createCell(item1.getKey()).setCellValue(Optional.ofNullable(item.get(item1.getValue())).map(x -> x.toString()).orElse(""));// 设置样式rowTemp.getCell(item1.getKey()).setCellStyle(cellStyle);}count++;}//设置统计时间rowTemp = sheet.createRow(count);DateTimeFormatter formatter = DateTimeFormatter.ofPattern(InternalStrConstant.DATE_FORMAT_STR);rowTemp.createCell(dateKey.size() - 1).setCellValue("统计日期:" + LocalDate.now().format(formatter));wb.write(outputStream);outputStream.flush();} catch (IOException e) {log.error(e.getMessage());}}/** * 获取cell样式 加黑色边框 * @param wb excel文件 * @return XSSFCellStyle样式 */public XSSFCellStyle getCellStyle(XSSFWorkbook wb) {//样式XSSFCellStyle cellStyle = wb.createCellStyle();cellStyle.setBorderBottom(BorderStyle.THIN);cellStyle.setBorderLeft(BorderStyle.THIN);cellStyle.setBorderTop(BorderStyle.THIN);cellStyle.setBorderRight(BorderStyle.THIN);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellStyle.setAlignment(HorizontalAlignment.CENTER);return cellStyle;}/** * 设置response属性 * @param response response * @param fileName 模板文件名 * @exception UnsupportedEncodingException 异常 */public static void setResponse(HttpServletResponse response, String fileName) throws UnsupportedEncodingException {// 清空输出流response.reset();// 定义输出类型response.setContentType(InternalStrConstant.CONTENT_TYPE);// 定义输出类型;charset=UTF-8response.setContentType(InternalStrConstant.CONTENT_TYPE_UTF_8);//设置Http响应头告诉浏览器下载这个附件response.setHeader("content-disposition","attachment; filename=" + URLEncoder.encode(fileName, InternalStrConstant.UTF_8));}如果有导出实体类的需求,可先将实体类转成map,数据量较小时可用,大数据量可能会有性能问题。
/** *实体转map通用方法 * @param bean 实体 * @return map集合 * @throws IntrospectionExceptionIntrospectionException * @throws InvocationTargetException InvocationTargetException * @throws IllegalAccessException IllegalAccessException */public static Map convertBean(Object bean) throws IntrospectionException, InvocationTargetException, IllegalAccessException {Class type = bean.getClass();Map returnMap = new HashMap();BeanInfo beanInfo = Introspector.getBeanInfo(type);PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();for (PropertyDescriptor descriptor : propertyDescriptors) {String propertyName = descriptor.getName();if (!"class".equals(propertyName)) {Method readMethod = descriptor.getReadMethod();Object result = readMethod.invoke(bean);if (result != null) {returnMap.put(propertyName, result);} else {returnMap.put(propertyName, "");}}}return returnMap;}使用方法举例:
public void download(String unitId, String period, HttpServletResponse response) {//查询数据List queryList = this.differenceAnalysis(unitId, period).getItems();//生成序号列int oderNumber = InternalNumConstant.ONE;for (Map item : queryList) {item.put("oderNumber", oderNumber);oderNumber++;}//设置地段对应的列Map mapKey = new HashMap();mapKey.put(0, "oderNumber");mapKey.put(1, "unitName");mapKey.put(2, "byUnit");mapKey.put(3, "byPostCategory");mapKey.put(4, "byMajor");mapKey.put(5, "unitAndPostCategory");mapKey.put(6, "unitAndMajor");mapKey.put(7, "majorAndPostCategory");//导出excelthis.exportUtil(queryList, "模板名称或文件地址", mapKey, "导出的文件名称.xlsx", 2, response);}POI导出不满足性能需求的时候,可以尝试使用阿里巴巴的easyExcel。
工作中可能不同的人有不同的操作习惯,有些同学喜欢将Word文档内容复制粘贴导入到Excel当中。在导入的过程中经常会出现一个尴尬的情况,那就是导入Excel后,表格中显示的文档内容格式总是错乱的。如上...
2024.11.20导语:Excel表格默认的灰色框线叫网格线,用来区分单元格。但有时候在操作的过程中,Excel中的网格线不见了。如图所示:原因:单元格的内容较多,把部分网格线遮挡了解决方法:增大列宽把光标放在两列之间...
2024.11.21简介相信大家能经常性的遇到项目上各类excel的导出,简单的excel格式,用简单的poi,easyExcel等工具都能导出。但是针对复杂的excel,有固定的样式、合并单元格、动态列等各类要求,导致...
2024.11.21最简单的方法 比如坐标 X=A1 Y=B1 在C1表格里输入=b1&","&A1然后复制表格 在cad里选择划线或点命令,在命令栏里粘贴就ok了 或者 a列x坐标,b列y坐标,c列=CONCATENA...
2024.11.191.简述在java开发项目,我们经常会遇到将数据导出到Excel表格的需求 ,比较流行的使用POI、EasyExcel等。Apache POI是一个Java API,用于处理Microsoft Off...
2024.11.21