java用POI設置Excel的列寬

【轉】:http://blog.csdn.net/duqian42707/article/details/51491312

需求:將某個excel中的某一列列寬設置爲35(該數值是Excel中顯示的列寬值)。
poi中設置列寬的方法爲:

HSSFSheet.setColumnWidth(int columnIndex, int width);

第一個參數好理解–列序號,關鍵是第二個參數寬度的值,應該設置爲多少呢?
我做了以下嘗試,發現均不好使

sheet.setColumnWidth(0, 35);            //a
sheet.setColumnWidth(0, (int)35.7*35);  //b
sheet.setColumnWidth(0, 256*35);        //c

查了以下,上面c這種寫法比較接近想要的結果,因爲setColumnWidth這個方法寬度的單位是字符數的256分之一,但是我想要點開Excel查看那一列的寬度時就顯示35,而不是34.29。如何比較精確地設置列寬呢?我想到了擬合方程這四個字。
所謂擬合是指已知某函數的若干離散函數值{f1,f2,…,fn},通過調整該函數中若干待定係數f(λ1, λ2,…,λn),使得該函數與已知點集的差別(最小二乘意義)最小。(來自百度百科)
說白了就是給你幾個離散點,讓你找規律,求出這些點滿足的函數表達式y=f(x)。有人要說了,這玩意上學的時候都沒學會,現在更不會求了。沒關係,我們可以藉助軟件的力量。最簡單的軟件就是Excel了。
說幹就幹。先嚐試以下設置

sheet.setColumnWidth(0, 9100);
sheet.setColumnWidth(0, 9150);
sheet.setColumnWidth(0, 9200);
sheet.setColumnWidth(0, 9250);
sheet.setColumnWidth(0, 9300);
sheet.setColumnWidth(0, 9350);

將生成的Excel的對應列的實際寬度記錄下來:
[34.86,35,35.29,35.43,35.57,35.86]
以實際寬度爲自變量x,你給的值爲函數值y,得到一系列離散點:(34.86,9100)(35,9150)(35.29,9200)(35.43,9250)(35.57,9300)(35.86,9350)
新建一個工作表,將數據輸入

x y
34.86 9100
35 9150
35.29 9200
35.43 9250
35.57 9300
35.86 9350

選中這些數據,點插入->圖表->散點圖,數據有了之後,再添加趨勢線,選線性,並顯示公式,結果如圖
這裏寫圖片描述
好我們得到了y與x的關係,接下來代碼裏就該這樣設置了:

sheet.setColumnWidth(0, 252*width+323);//width=35

但是這個公式並不十分準確,比如當width=9時,生成的Excel實際寬度卻是9.43,怎麼辦?多取一些點再進行擬合。
於是有了下面的結果:
這裏寫圖片描述
最後我們的表達式爲:y=255.86x+184.27
代碼裏這樣設置

sheet.setColumnWidth(0, 256*width+184);

這次就比較精確了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章