Java使用jxl包寫Excel文件適合列寬實(shí)現(xiàn)
注意,這個(gè)只是基本可以實(shí)現(xiàn),基本針對中文電子報(bào)表。
1.實(shí)現(xiàn)思路
(1)一般的中文漢字占位長度是英文字母的2倍,“方塊字”很統(tǒng)一。
(2)對于要寫入Excel中的數(shù)據(jù)統(tǒng)計(jì)每一列的最大列寬,最后直接將這一列的列寬設(shè)置為這個(gè)列的最大值即可。
2.實(shí)現(xiàn)代碼
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{
//構(gòu)造數(shù)據(jù),有兩行
List<String> row1=new ArrayList<String>(); row1.add("最合適列寬"); row1.add("這個(gè)基本可以實(shí)現(xiàn)");
List<String> row2=new ArrayList<String>(); row2.add("Best Column Width"); row2.add("Haha");
List list=new ArrayList(); list.add(row1); list.add(row2);
//寫數(shù)據(jù)到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()]; //保存最佳列寬數(shù)據(jù)的數(shù)組
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個(gè)單位長度
if(columnBestWidth[j]<width) ///求取到目前為止的最佳列寬
columnBestWidth[j]=width;
}
}
for(int i=0;i<columnBestWidth.length;i++){ ///設(shè)置每列寬
sheet.setColumnView(i, columnBestWidth[i]);
}
}
public static int getChineseNum(String context){ ///統(tǒng)計(jì)context中是漢字的個(gè)數(shù)
int lenOfChinese=0;
Pattern p = Pattern.compile("[\u4e00-\u9fa5]"); //漢字的Unicode編碼范圍
Matcher m = p.matcher(context);
while(m.find()){
lenOfChinese++;
}
return lenOfChinese;
}
}
3.只是實(shí)現(xiàn)而已
(1)這個(gè)是一次項(xiàng)目中寫的,自動導(dǎo)數(shù)Excel電子報(bào)表,可以很好實(shí)現(xiàn)。主要是:漢字,阿拉伯?dāng)?shù)字。
(2)漢字是方塊字,每個(gè)字的大小很統(tǒng)一,可以很驚奇的統(tǒng)計(jì)列寬。
(3)英文小寫字母共26個(gè),每個(gè)字母的大小差異很小,也可以實(shí)現(xiàn)最佳列寬。
(4)其他字符,每個(gè)字符的占位大小差異不定,比如大小字母序列“IIIIIII”和字母“DDDDDDD”。
總之,jxl.jar沒有自動實(shí)現(xiàn)最適合列寬的方法;如果要導(dǎo)出的電子報(bào)表中漢字占絕大多數(shù),就能很好的用這個(gè)程序?qū)崿F(xiàn)最適合列寬。
相關(guān)文章
java8使用流的filter來篩選數(shù)據(jù)的實(shí)現(xiàn)
這篇文章主要介紹了java8使用流的filter來篩選數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03MyBatis使用注解開發(fā)和無主配置文件開發(fā)的情況
這篇文章主要介紹了MyBatis使用注解開發(fā)和無主配置文件開發(fā)的情況,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Java中關(guān)于http請求獲取FlexManager某設(shè)備分組監(jiān)控點(diǎn)
這篇文章主要介紹了Java中關(guān)于http請求獲取FlexManager某設(shè)備分組監(jiān)控點(diǎn),本文僅僅介紹了使用http請求獲取FlexManager平臺某個(gè)FBox盒子即某設(shè)備的監(jiān)控點(diǎn)分組的分組下的所有監(jiān)控點(diǎn)信息,需要的朋友可以參考下2022-10-10Netty分布式固定長度解碼器實(shí)現(xiàn)原理剖析
這篇文章主要為大家介紹了Netty分布式固定長度解碼器原理剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03java虛擬機(jī)JVM類加載機(jī)制原理(面試必問)
這篇文章主要介紹了面試當(dāng)中必會問到的java虛擬機(jī)JVM類加載機(jī)制,非常的詳細(xì),有需要的朋友可以借鑒參考下,歡迎多多交流討論2021-08-08Springboot集成第三方j(luò)ar快速實(shí)現(xiàn)微信、支付寶等支付場景
這篇文章主要介紹了Springboot集成第三方j(luò)ar快速實(shí)現(xiàn)微信、支付寶等支付場景,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01