使用C#解決Excel自動適應(yīng)列寬的問題
問題現(xiàn)象
通過 COM 操作 Excel 自動適應(yīng)列寬的方法是 AutoFit 方法,該方法適于自動適應(yīng)列寬或行高。
最近在我們的一款應(yīng)用里發(fā)現(xiàn)效果并沒有符合預(yù)期,我們提供了一個(gè)可以設(shè)置導(dǎo)出Excel花名冊的配置功能,如下圖:

通過查詢配置表,可以看到當(dāng)選擇需要輸出的列的時(shí)候,可以設(shè)置 excel 列的寬度,以滿足輸出樣式。列寬的值可以設(shè)置0到255的數(shù)值,在 C# 中列寬(ColumnWidth)是一個(gè) dynamic 類型,如下示例代碼:
Range _range=excel.Range[excel.Cells[1,1],excel.Cells[65536,1]]; _range.ColumnWidth=255;
通過獲取 Range 對象,將其 ColumnWidth 設(shè)置為我們配置的值。在我們的應(yīng)用里,如果配置為 -1 ,則表示使用自動適應(yīng)列寬模式,這就用到了如下代碼:
Range _range=excel.Range[excel.Cells[1,1],excel.Cells[65536,1]];
if(config_width==-1){
_range.Columns.AutoFit();
}我們在應(yīng)用里配置了類似“家庭成員情況”、“主要社會關(guān)系人” 、“學(xué)習(xí)經(jīng)歷”、“工作經(jīng)歷” 等履歷型的多行文本輸出,使用了自動適應(yīng)列寬模式,輸出效果如下:

實(shí)際上是我們想要得到這樣的效果:

原因分析
根據(jù)輸出效果,我們在 Excel 里模擬操作一下自適應(yīng)列寬,將鼠標(biāo)移動到指定的列的表頭的分隔線處,鼠標(biāo)形狀會顯示為左右箭頭分隔狀,然后雙擊即可實(shí)現(xiàn)自動列寬。

發(fā)現(xiàn)有以下幾種情況:
(1)如果單元格未設(shè)置為自動換行,我們將列寬手動調(diào)小于文字顯示的長度,雙擊后將成功自動適應(yīng)為最大文字長度的合適列寬。
(2)如果單元格設(shè)置為自動換行,我們將列寬手動調(diào)小于文字顯示的長度,雙擊后將沒有達(dá)成預(yù)期的顯示列寬。
(3)如果單元格設(shè)置為自動換行,我們將列寬手動調(diào)大于多行文字顯示的長度,雙擊后將成功自動適應(yīng)為最大文字長度的合適列寬。
因此我們可以使用 C# 模擬情況(3)的操作來解決情況(2)的問題。
范例運(yùn)行環(huán)境
操作系統(tǒng): Windows Server 2019 DataCenter
.net版本: .netFramework4.0 或以上
Office Excel 2016
開發(fā)工具:VS2019 C#
解決問題
生成測試文本
我們假設(shè)生成了如下 HtmlTable 表格內(nèi)容:
| 姓名 | 與本人關(guān)系 | 政治面目 | 工作單位 | 職務(wù) |
| 姓名1 | 父親 | 群眾 | 工作單位工作單位 | 工人 |
| 姓名2 | 母親 | 群眾 | 工作單位2 | 員工 |
| 姓名3 | 子女 | 群眾 | 無工作單位 | 無 |
我們通過遍歷行列的方法,計(jì)算每個(gè)單元格相對于列的最大字節(jié)數(shù) GetByteCount(不是長度Length),示例代碼如下:
for (int i = 0; i < mtable.Rows[0].Cells.Count; i++)
{
int maxlen = 0;
for (int j = 0; j < mtable.Rows.Count; j++)
{
HtmlTableCell curcell=mtable.Rows[j].Cells[i];
int curlen=System.Text.Encoding.Default.GetByteCount(curcell.InnerText);
if (curlen > maxlen)
{
maxlen = curlen;
}
}
mtable.Rows[0].Cells[i].Attributes["maxlen"] = maxlen.ToString();
}
string excel = "";
for (int i = 0; i < mtable.Rows.Count; i++)
{
for (int j = 0; j < mtable.Rows[i].Cells.Count; j++)
{
int maxlen =int.Parse(mtable.Rows[0].Cells[j].Attributes["maxlen"]);
HtmlTableCell curcell = mtable.Rows[i].Cells[j];
excel += curcell.InnerText + string.Concat(Enumerable.Repeat(" ", maxlen - System.Text.Encoding.Default.GetByteCount(curcell.InnerText)))+" " ;
curcell.InnerText);
}
excel += "\r\n";
}實(shí)現(xiàn)自適應(yīng)
通過生成測試文本,保存到數(shù)據(jù)庫并輸出到 Excel 指定列,實(shí)現(xiàn)自適應(yīng)非常簡單,將列值設(shè)置為最大值,再使用自適應(yīng)AutoFit 方法,即可以讓 Excel 自動計(jì)算并重新調(diào)整列寬,代碼如下:
Range _range=excel.Range[excel.Cells[1,1],excel.Cells[65536,1]];
if(config_width==-1){
_range.ColumnWidth = 255;
_range.Columns.AutoFit();
}自此完美解決。
小結(jié)
到此這篇關(guān)于使用C#解決Excel自動適應(yīng)列寬的問題的文章就介紹到這了,更多相關(guān)C# Excel自適應(yīng)列寬內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#十六進(jìn)制字符串轉(zhuǎn)十進(jìn)制int的方法
這篇文章主要介紹了C#十六進(jìn)制字符串轉(zhuǎn)十進(jìn)制int的方法,涉及C#操作數(shù)制轉(zhuǎn)換的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
C#之App.Config文件操作的實(shí)現(xiàn)
AppConfigHelper提供了一種方便的方式來讀取、添加、修改和刪除應(yīng)用程序配置文件中的配置項(xiàng),本文主要介紹了C#之App.Config文件操作的實(shí)現(xiàn),感興趣的可以了解一下2026-01-01
winform dateTime數(shù)據(jù)類型轉(zhuǎn)換方法
這篇文章主要介紹了winform dateTime數(shù)據(jù)類型轉(zhuǎn)換方法,需要的朋友可以參考下2017-02-02
在winform下實(shí)現(xiàn)左右布局多窗口界面的方法
在web頁面上我們可以通過frameset,iframe嵌套框架很容易實(shí)現(xiàn)各種導(dǎo)航+內(nèi)容的布局界面,而在winform、WPF中實(shí)現(xiàn)其實(shí)也很容易,通過本文給大家介紹在winform下實(shí)現(xiàn)左右布局多窗口界面的方法,本文介紹的非常詳細(xì),對winform布局相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2016-02-02
C#高效實(shí)現(xiàn)在Word文檔中自動化創(chuàng)建圖表的可視化方案
本文將深入探討如何利用C#,結(jié)合一款功能強(qiáng)大的第三方庫,實(shí)現(xiàn)在Word文檔中自動化創(chuàng)建圖表,為你的數(shù)據(jù)呈現(xiàn)和報(bào)告生成提供一套實(shí)用且高效的解決方案2025-12-12
C#實(shí)現(xiàn)輸入10個(gè)數(shù)存入到數(shù)組中并求max和min及平均數(shù)的方法示例
這篇文章主要介紹了C#實(shí)現(xiàn)輸入10個(gè)數(shù)存入到數(shù)組中并求max和min及平均數(shù)的方法,涉及C#簡單數(shù)據(jù)轉(zhuǎn)換與數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-07-07

