欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java使用jxl包写Excel文件适合列宽实现

程序员文章站 2024-02-15 09:28:10
注意,这个只是基本可以实现,基本针对中文电子报表。 1.实现思路(1)一般的中文汉字占位长度是英文字母的2倍,“方块字”很统一。(2)对于要写入excel中的数据统计每一...

注意,这个只是基本可以实现,基本针对中文电子报表。

1.实现思路
(1)一般的中文汉字占位长度是英文字母的2倍,“方块字”很统一。
(2)对于要写入excel中的数据统计每一列的最大列宽,最后直接将这一列的列宽设置为这个列的最大值即可。

2.实现代码

复制代码 代码如下:

import java.io.file;
import java.util.arraylist;
import java.util.list;
import java.util.regex.matcher;
import java.util.regex.pattern;

import jxl.workbook;
import jxl.write.label;
import jxl.write.writablesheet;
import jxl.write.writableworkbook;

//中文名
public class excelbestcolumn
{
    public static void main(string argus[]) throws exception{
        //构造数据,有两行
         list<string> row1=new arraylist<string>();    row1.add("最合适列宽");    row1.add("这个基本可以实现");
        list<string> row2=new arraylist<string>();    row2.add("best column width");    row2.add("haha");
        list list=new arraylist();    list.add(row1);    list.add(row2);

        //写数据到excel中
        writableworkbook book= workbook.createworkbook(new file("t.xls"));
        writablesheet sheet=book.createsheet("测试",0);
        writedatatosheet(sheet,list);
        book.write();
        book.close();
    }

    public static void writedatatosheet(writablesheet sheet,list<list<string>> list) throws exception{
        int columnbestwidth[]=new  int[list.get(0).size()];    //保存最佳列宽数据的数组

        for(int i=0;i<list.size();i++){
            list<string> row=list.get(i);
            for(int j=0;j<row.size();j++){
                 sheet.addcell(new label(j,i,row.get(j)));

                 int width=row.get(j).length()+getchinesenum(row.get(j));    ///汉字占2个单位长度
                 if(columnbestwidth[j]<width)    ///求取到目前为止的最佳列宽
                     columnbestwidth[j]=width;
            }
        }

        for(int i=0;i<columnbestwidth.length;i++){    ///设置每列宽
            sheet.setcolumnview(i, columnbestwidth[i]);
        }
    }

    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;
    }
}

3.只是实现而已
(1)这个是一次项目中写的,自动导数excel电子报表,可以很好实现。主要是:汉字,阿拉伯数字。
(2)汉字是方块字,每个字的大小很统一,可以很惊奇的统计列宽。
(3)英文小写字母共26个,每个字母的大小差异很小,也可以实现最佳列宽。
(4)其他字符,每个字符的占位大小差异不定,比如大小字母序列“iiiiiii”和字母“ddddddd”。

总之,jxl.jar没有自动实现最适合列宽的方法;如果要导出的电子报表中汉字占绝大多数,就能很好的用这个程序实现最适合列宽。