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

通過(guò)查詢配置表,可以看到當(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;
通過(guò)獲取 Range 對(duì)象,將其 ColumnWidth 設(shè)置為我們配置的值。在我們的應(yīng)用里,如果配置為 -1 ,則表示使用自動(dòng)適應(yīng)列寬模式,這就用到了如下代碼:
Range _range=excel.Range[excel.Cells[1,1],excel.Cells[65536,1]];
if(config_width==-1){
_range.Columns.AutoFit();
}我們?cè)趹?yīng)用里配置了類似“家庭成員情況”、“主要社會(huì)關(guān)系人” 、“學(xué)習(xí)經(jīng)歷”、“工作經(jīng)歷” 等履歷型的多行文本輸出,使用了自動(dòng)適應(yīng)列寬模式,輸出效果如下:

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

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

發(fā)現(xiàn)有以下幾種情況:
(1)如果單元格未設(shè)置為自動(dòng)換行,我們將列寬手動(dòng)調(diào)小于文字顯示的長(zhǎng)度,雙擊后將成功自動(dòng)適應(yīng)為最大文字長(zhǎng)度的合適列寬。
(2)如果單元格設(shè)置為自動(dòng)換行,我們將列寬手動(dòng)調(diào)小于文字顯示的長(zhǎng)度,雙擊后將沒有達(dá)成預(yù)期的顯示列寬。
(3)如果單元格設(shè)置為自動(dòng)換行,我們將列寬手動(dòng)調(diào)大于多行文字顯示的長(zhǎng)度,雙擊后將成功自動(dòng)適應(yīng)為最大文字長(zhǎng)度的合適列寬。
因此我們可以使用 C# 模擬情況(3)的操作來(lái)解決情況(2)的問題。
范例運(yùn)行環(huán)境
操作系統(tǒng): Windows Server 2019 DataCenter
.net版本: .netFramework4.0 或以上
Office Excel 2016
開發(fā)工具:VS2019 C#
解決問題
生成測(cè)試文本
我們假設(shè)生成了如下 HtmlTable 表格內(nèi)容:
| 姓名 | 與本人關(guān)系 | 政治面目 | 工作單位 | 職務(wù) |
| 姓名1 | 父親 | 群眾 | 工作單位工作單位 | 工人 |
| 姓名2 | 母親 | 群眾 | 工作單位2 | 員工 |
| 姓名3 | 子女 | 群眾 | 無(wú)工作單位 | 無(wú) |
我們通過(guò)遍歷行列的方法,計(jì)算每個(gè)單元格相對(duì)于列的最大字節(jié)數(shù) GetByteCount(不是長(zhǎng)度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)
通過(guò)生成測(cè)試文本,保存到數(shù)據(jù)庫(kù)并輸出到 Excel 指定列,實(shí)現(xiàn)自適應(yīng)非常簡(jiǎn)單,將列值設(shè)置為最大值,再使用自適應(yīng)AutoFit 方法,即可以讓 Excel 自動(dòng)計(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自動(dòng)適應(yīng)列寬的問題的文章就介紹到這了,更多相關(guān)C# Excel自適應(yīng)列寬內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Unity UGUI的Slider滑動(dòng)條件組使用詳解
這篇文章主要為大家介紹了Unity UGUI的Slider滑動(dòng)條件組使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
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提供了一種方便的方式來(lái)讀取、添加、修改和刪除應(yīng)用程序配置文件中的配置項(xiàng),本文主要介紹了C#之App.Config文件操作的實(shí)現(xiàn),感興趣的可以了解一下2026-01-01
C#使用MD5算法對(duì)密碼進(jìn)行加密的示例代碼
MD5(Message Digest Algorithm 5)是一種被廣泛使用的“消息-摘要算法”,“消息-摘要算法”實(shí)際上就是一個(gè)單項(xiàng)散列函數(shù),數(shù)據(jù)塊經(jīng)過(guò)單向散列函數(shù)得到一個(gè)固定長(zhǎng)度的散列值,本文給大家介紹了C#使用MD5算法對(duì)密碼進(jìn)行加密,需要的朋友可以參考下2024-03-03
winform dateTime數(shù)據(jù)類型轉(zhuǎn)換方法
這篇文章主要介紹了winform dateTime數(shù)據(jù)類型轉(zhuǎn)換方法,需要的朋友可以參考下2017-02-02
在winform下實(shí)現(xiàn)左右布局多窗口界面的方法
在web頁(yè)面上我們可以通過(guò)frameset,iframe嵌套框架很容易實(shí)現(xiàn)各種導(dǎo)航+內(nèi)容的布局界面,而在winform、WPF中實(shí)現(xiàn)其實(shí)也很容易,通過(guò)本文給大家介紹在winform下實(shí)現(xiàn)左右布局多窗口界面的方法,本文介紹的非常詳細(xì),對(duì)winform布局相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-02-02
C#高效實(shí)現(xiàn)在Word文檔中自動(dòng)化創(chuàng)建圖表的可視化方案
本文將深入探討如何利用C#,結(jié)合一款功能強(qiáng)大的第三方庫(kù),實(shí)現(xiàn)在Word文檔中自動(dòng)化創(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#簡(jiǎn)單數(shù)據(jù)轉(zhuǎn)換與數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-07-07

