【轉】: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);
這次就比較精確了。