• easyexcel: The maximum length of cell contents (text) is 32,767 characters


    easyexcel The maximum length of cell contents (text) is 32,767 characters

    使用easyexcel向excel中写内容出现了单元格大小不能超过32,767的限制,这是因为excel 2007限制单个cell不能超过32767个字符,但是现在都2020年了。。。。

     .xls和.xlsx文件格式有32,767个字符的硬限制. Apache POI只是强制执行Excel限制的文件格式.您可以在Microsoft文档中查看这些限制的详细信息,也可以在 this Apache POI javadoc page中很好地捕获

    将poi更新到最新版本仔细看看源码 org.apache.poi.ss.SpreadsheetVersion 中只用excel97 和excel2007俩个选项 ,XSSFCell 类被修饰为final 不能被继承重写版本校验方法。
     
    解决办法:
    方法一:扩大最大值
    在自己的项目文件夹下创建org.apache.poi.ss.SpreadsheetVersion 类,复制poi中的该类源码,excel2007中的最后一个值改为int类型最大值。重试导出问题解决。

    方法二:截取,分成多列存储

     1 private static void writeRowsToExcel(XSSFWorkbook wb, Sheet sheet, List<List<Object>> rows, int rowIndex) {
     2         int colIndex = 0;
     3 
     4         Font dataFont = wb.createFont();
     5         dataFont.setFontName("simsun");
     6         dataFont.setColor(IndexedColors.BLACK.index);
     7 
     8         XSSFCellStyle dataStyle = wb.createCellStyle();
     9         dataStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
    10         dataStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
    11         dataStyle.setFont(dataFont);
    12         setBorder(dataStyle, BorderStyle.THIN, new XSSFColor(new Color(0, 0, 0)));
    13 
    14         for (List<Object> rowData : rows) {
    15             Row dataRow = sheet.createRow(rowIndex);
    16             colIndex = 0;
    17             for (Object cellData : rowData) {
    18                 colIndex = setCell(cellData.toString(), dataRow, colIndex, dataStyle);
    19             }
    20             rowIndex++;
    21         }
    22     }
    23 
    24     private static int setCell(String data, Row dataRow, Integer colIndex, XSSFCellStyle dataStyle) {
    25 
    26         int max = 32767;
    27         if (data == null || data.length() < max) {
    28             Cell cell = dataRow.createCell(colIndex);
    29             cell.setCellStyle(dataStyle);
    30             cell.setCellValue(data == null ? "" : data);
    31             colIndex++;
    32         } else {
    33             int num = data.length() / max;
    34             for (int i = 0; i < num; i++) {
    35                 Cell cell = dataRow.createCell(colIndex);
    36                 cell.setCellStyle(dataStyle);
    37                 cell.setCellValue(data.substring(i * max, max * (i + 1)));
    38                 colIndex++;
    39             }
    40             int extra = data.length() % max;
    41             if (extra > 0) {
    42                 Cell cell = dataRow.createCell(colIndex);
    43                 cell.setCellStyle(dataStyle);
    44                 cell.setCellValue(data.substring(num * max, num * max + extra));
    45                 colIndex++;
    46             }
    47         }
    48         return colIndex;
    49     }
    示例

    方法三:切换文件格式 (推荐)

    如果您确实需要长文本,则需要切换到另一种文件格式,例如CSV

    CSV是逗号分隔文件(Comma Separated Values)的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件。在 CSV文件中,数据“栏”以逗号分隔,可允许程序通过读取文件为数据重新创建正确的栏结构,并在每次遇到逗号时开始新的一栏。如:

    1,张三,男
    2,李四,男
    3,小红,女
      1 package com.yph.omp.common.util;
      2 
      3 import java.io.BufferedWriter;
      4 import java.io.File;
      5 import java.io.FileInputStream;
      6 import java.io.FileNotFoundException;
      7 import java.io.FileOutputStream;
      8 import java.io.IOException;
      9 import java.io.InputStream;
     10 import java.io.OutputStream;
     11 import java.io.OutputStreamWriter;
     12 import java.util.ArrayList;
     13 import java.util.Iterator;
     14 import java.util.LinkedHashMap;
     15 import java.util.List;
     16 import java.util.Map;
     17 
     18 import javax.servlet.http.HttpServletRequest;
     19 import javax.servlet.http.HttpServletResponse;
     20 
     21 import org.apache.commons.beanutils.BeanUtils;
     22 import org.junit.Test;
     23 
     24 /**
     25  * Java生成CSV文件
     26  */
     27 public class CSVUtil {
     28 
     29     /**
     30      * 生成为CVS文件
     31      * 
     32      * @param exportData
     33      *            源数据List
     34      * @param map
     35      *            csv文件的列表头map
     36      * @param outPutPath
     37      *            文件路径
     38      * @param fileName
     39      *            文件名称
     40      * @return
     41      */
     42     @SuppressWarnings("rawtypes")
     43     public static File createCSVFile(List exportData, LinkedHashMap map,
     44             String outPutPath, String fileName) {
     45         File csvFile = null;
     46         BufferedWriter csvFileOutputStream = null;
     47         try {
     48             File file = new File(outPutPath);
     49             if (!file.exists()) {
     50                 file.mkdir();
     51             }
     52             // 定义文件名格式并创建
     53             csvFile = File.createTempFile(fileName, ".csv",
     54                     new File(outPutPath));
     55             // UTF-8使正确读取分隔符","
     56             csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(
     57                     new FileOutputStream(csvFile), "GBK"), 1024);
     58             // 写入文件头部
     59             for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator
     60                     .hasNext();) {
     61                 java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator
     62                         .next();
     63                 csvFileOutputStream
     64                         .write(""" + (String) propertyEntry.getValue() != null ? (String) propertyEntry
     65                                 .getValue() : "" + """);
     66                 if (propertyIterator.hasNext()) {
     67                     csvFileOutputStream.write(",");
     68                 }
     69             }
     70             csvFileOutputStream.newLine();
     71             // 写入文件内容
     72             for (Iterator iterator = exportData.iterator(); iterator.hasNext();) {
     73                 Object row = (Object) iterator.next();
     74                 for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator
     75                         .hasNext();) {
     76                     java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator
     77                             .next();            /*-------------------------------*/ 
     78                     //以下部分根据不同业务做出相应的更改
     79                     StringBuilder sbContext = new StringBuilder("");
     80                     if (null != BeanUtils.getProperty(row,(String) propertyEntry.getKey())) {
     81                         if("证件号码".equals(propertyEntry.getValue())){
     82                             //避免:身份证号码 ,读取时变换为科学记数 - 解决办法:加 	(用Excel打开时,证件号码超过15位后会自动默认科学记数)
     83                             sbContext.append(BeanUtils.getProperty(row,(String) propertyEntry.getKey()) + "	");
     84                         }else{
     85                             sbContext.append(BeanUtils.getProperty(row,(String) propertyEntry.getKey()));                            
     86                         }
     87                     }
     88                     csvFileOutputStream.write(sbContext.toString());
     89             /*-------------------------------*/                    
     90                     if (propertyIterator.hasNext()) {
     91                         csvFileOutputStream.write(",");
     92                     }
     93                 }
     94                 if (iterator.hasNext()) {
     95                     csvFileOutputStream.newLine();
     96                 }
     97             }
     98             csvFileOutputStream.flush();
     99         } catch (Exception e) {
    100             e.printStackTrace();
    101         } finally {
    102             try {
    103                 csvFileOutputStream.close();
    104             } catch (IOException e) {
    105                 e.printStackTrace();
    106             }
    107         }
    108         return csvFile;
    109     }
    110 
    111     /**
    112      * 下载文件
    113      * 
    114      * @param response
    115      * @param csvFilePath
    116      *            文件路径
    117      * @param fileName
    118      *            文件名称
    119      * @throws IOException
    120      */
    121     public static void exportFile(HttpServletRequest request,
    122             HttpServletResponse response, String csvFilePath, String fileName)
    123             throws IOException {
    124         response.setCharacterEncoding("UTF-8");
    125         response.setContentType("application/csv;charset=GBK");
    126         
    127         response.setHeader("Content-Disposition", "attachment; filename="
    128                 + new String(fileName.getBytes("GB2312"), "ISO8859-1"));
    129         InputStream in = null;
    130         try {
    131             in = new FileInputStream(csvFilePath);
    132             int len = 0;
    133             byte[] buffer = new byte[1024];
    134             OutputStream out = response.getOutputStream();
    135             while ((len = in.read(buffer)) > 0) {
    136                 out.write(buffer, 0, len);
    137             }
    138         } catch (FileNotFoundException e1) {
    139             System.out.println(e1);
    140         } finally {
    141             if (in != null) {
    142                 try {
    143                     in.close();
    144                 } catch (Exception e1) {
    145                     throw new RuntimeException(e1);
    146                 }
    147             }
    148         }
    149     }
    150 
    151     /**
    152      * 删除该目录filePath下的所有文件
    153      * 
    154      * @param filePath
    155      *            文件目录路径
    156      */
    157     public static void deleteFiles(String filePath) {
    158         File file = new File(filePath);
    159         if (file.exists()) {
    160             File[] files = file.listFiles();
    161             for (int i = 0; i < files.length; i++) {
    162                 if (files[i].isFile()) {
    163                     files[i].delete();
    164                 }
    165             }
    166         }
    167     }
    168 
    169     /**
    170      * 删除单个文件
    171      * 
    172      * @param filePath
    173      *            文件目录路径
    174      * @param fileName
    175      *            文件名称
    176      */
    177     public static void deleteFile(String filePath, String fileName) {
    178         File file = new File(filePath);
    179         if (file.exists()) {
    180             File[] files = file.listFiles();
    181             for (int i = 0; i < files.length; i++) {
    182                 if (files[i].isFile()) {
    183                     if (files[i].getName().equals(fileName)) {
    184                         files[i].delete();
    185                         return;
    186                     }
    187                 }
    188             }
    189         }
    190     }
    191 
    192     @SuppressWarnings({ "unchecked", "rawtypes" })
    193     @Test
    194     public void createFileTest() {
    195         List exportData = new ArrayList<Map>();
    196         Map row1 = new LinkedHashMap<String, String>();
    197         row1.put("1", "11");
    198         row1.put("2", "12");
    199         row1.put("3", "13");
    200         row1.put("4", "14");
    201         exportData.add(row1);
    202         row1 = new LinkedHashMap<String, String>();
    203         row1.put("1", "21");
    204         row1.put("2", "22");
    205         row1.put("3", "23");
    206         row1.put("4", "24");
    207         exportData.add(row1);
    208         LinkedHashMap map = new LinkedHashMap();
    209         map.put("1", "第一列");
    210         map.put("2", "第二列");
    211         map.put("3", "第三列");
    212         map.put("4", "第四列");
    213 
    214         String path = "d:/export";
    215         String fileName = "文件导出";
    216         File file = CSVUtil.createCSVFile(exportData, map, path, fileName);
    217         String fileNameNew = file.getName();
    218         String pathNew = file.getPath();
    219         System.out.println("文件名称:" + fileNameNew );
    220         System.out.println("文件路径:" + pathNew );
    221     }
    222 }//注:BeanUtils.getProperty(row,(String) propertyEntry.getKey()) + "	" ,只为解决数字格式超过15位后,在Excel中打开展示科学记数问题。
    Java生成CSV文件
    参考:
    https://www.jianshu.com/p/9e73399b6c38 
    http://www.voidcn.com/article/p-wrsnsvtm-bxy.html
    https://www.cnblogs.com/bailuobo/p/4911764.html
  • 相关阅读:
    iOS企业证书开发的APP证书过期时间监控
    事件冒泡,事件捕获
    倒计时
    获取多个div,点击第几个,显示第几个
    js继承
    javascript基础知识总结
    大型web系统高效应用方法(转载)
    数据库(内联,外联,交叉联)
    .net零碎基础知识点不完全小结
    C#的内存管理:堆、栈、托管堆与指针(转)
  • 原文地址:https://www.cnblogs.com/zt007/p/14824395.html
Copyright © 2020-2023  润新知