jxl设置单元格内容为中文的列宽

在Java中,使用jxl来导出数据到execl表格中,遇到列宽不会自动适应问题,现在做如下记录.

导出的数据中,包括中文,字母,数字的类型.

在做自动适配列宽的时候,使用了方法一:

CellView cellView = new CellView();
cellView.setAutosize(true);

writableSheet.setColumnView(0, cellView);

显示的效果并不能 进行自动适配,特别是适配地址字段的时候

方法二:

String fieldVal = "一长串的地址等等"

wSheet.setColumnView(row, fieldVal.length());

自动适配也失败

方法三:

在获取到的数据之后,取任意一段数据,比如我的数据是一个对象,该对象包含个人的信息,将个人的信息存储到一个list中

List row = new ArrayList<>();
        int last = list.size() - 1;
        row.add(list.get(last).getIdCard());
        row.add(list.get(last).getType());
        row.add(list.get(last).getConsigneeName());
        row.add(list.get(last).getAddress());
        row.add(TimeFormatUtil.formatTime(list.get(last).getCreateTime())); 

接下来获取最优的列宽

 int[] colBestWidth = new int[row.size()];
        for (int i = 0; i < row.size(); i++) {
            int widthRow = 0;
            if (row.get(i) != null) {
                widthRow = row.get(i).length() + ExportUtil.getChineseNum(row.get(i));
            }
            int widthField = fieldList.get(i).length() + ExportUtil.getChineseNum(fieldList.get(i));
            // 比较一行的列宽
            if (colBestWidth[i] < widthRow) {
                colBestWidth[i] = widthRow;
                // 单元格列宽与单元格表头列宽比较
                if (colBestWidth[i] < widthField) {
                    colBestWidth[i] = widthField + 2;
                }
            }
        }

ExportUtil.getChineseNum(String value) 方法如下

public static int getChineseNum(String context){    ///统计context中是汉字的个数
        int lenOfChinese=0;
        Pattern p = Pattern.compile("[\u4e00-\u9fa5]");    //汉字的Unicode编码范围
        Matcher m = p.matcher(context);
        while(m.find()){
            lenOfChinese++;
        }
        return lenOfChinese;
    }

将格式设置到表格中

for (int j = 0; j < colBestWidth.length; j++) {
                    writableSheet.setColumnView(j, colBestWidth[j]);
                }

以上便实现了自动列宽的功能.

jxl中没有自动适配单元格内容为中文的列宽的方法,需要自己手动比较每个列宽所需的最优宽度. (如果单纯只是英文字母的,方法一和方法二可能可以,目前没试过,但如果带有中文的,则不可以使用方法一和方法二)

你可能感兴趣的:(java)