当前位置: 首页 > news >正文

C# 解决 Excel 自动适应列宽的问题

目录

问题现象

原因分析

范例运行环境

解决问题

生成测试文本

实现自适应

小结


问题现象

通过 COM 操作 Excel 自动适应列宽的方法是 AutoFit 方法,该方法适于自动适应列宽或行高。

最近在我们的一款应用里发现效果并没有符合预期,我们提供了一个可以设置导出Excel花名册的配置功能,如下图:

通过查询配置表,可以看到当选择需要输出的列的时候,可以设置 excel 列的宽度,以满足输出样式。列宽的值可以设置0到255的数值,在 C# 中列宽(ColumnWidth)是一个 dynamic 类型,如下示例代码:

Range  _range=excel.Range[excel.Cells[1,1],excel.Cells[65536,1]];_range.ColumnWidth=255;

通过获取 Range 对象,将其 ColumnWidth 设置为我们配置的值。在我们的应用里,如果配置为 -1 ,则表示使用自动适应列宽模式,这就用到了如下代码:

Range  _range=excel.Range[excel.Cells[1,1],excel.Cells[65536,1]];if(config_width==-1){_range.Columns.AutoFit();
}

我们在应用里配置了类似“家庭成员情况”、“主要社会关系人” 、“学习经历”、“工作经历” 等履历型的多行文本输出,使用了自动适应列宽模式,输出效果如下:

 实际上是我们想要得到这样的效果:

原因分析

根据输出效果,我们在 Excel 里模拟操作一下自适应列宽,将鼠标移动到指定的列的表头的分隔线处,鼠标形状会显示为左右箭头分隔状,然后双击即可实现自动列宽。

发现有以下几种情况:

(1)如果单元格未设置为自动换行,我们将列宽手动调小于文字显示的长度,双击后将成功自动适应为最大文字长度的合适列宽。

(2)如果单元格设置为自动换行,我们将列宽手动调小于文字显示的长度,双击后将没有达成预期的显示列宽。

(3)如果单元格设置为自动换行,我们将列宽手动调大于多行文字显示的长度,双击后将成功自动适应为最大文字长度的合适列宽。

因此我们可以使用 C# 模拟情况(3)的操作来解决情况(2)的问题。

范例运行环境

操作系统: Windows Server 2019 DataCenter

.net版本: .netFramework4.0 或以上

Office Excel 2016

开发工具:VS2019  C# 

解决问题

生成测试文本

我们假设生成了如下 HtmlTable 表格内容:

姓名与本人关系政治面目工作单位职务
姓名1父亲 群众工作单位工作单位工人
姓名2母亲群众工作单位2员工
姓名3子女群众无工作单位

我们通过遍历行列的方法,计算每个单元格相对于列的最大字节数 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";}

实现自适应

通过生成测试文本,保存到数据库并输出到 Excel 指定列,实现自适应非常简单,将列值设置为最大值,再使用自适应AutoFit 方法,即可以让 Excel 自动计算并重新调整列宽,代码如下:

 

Range  _range=excel.Range[excel.Cells[1,1],excel.Cells[65536,1]];if(config_width==-1){_range.ColumnWidth = 255;_range.Columns.AutoFit();
}

自此完美解决。

 

小结

关于 AutoFit 方法的更多参考,请访问如下链接:

https://learn.microsoft.com/zh-cn/office/vba/api/excel.autofit?source=recommendations

本文代码仅供您参考使用,感谢您的阅读,希望本文能够对您有所帮助。

相关文章:

  • Fatfs
  • nginx隐藏版本号、错误信息页面隐藏nginx软件、修改 HTTP 头信息中的connection 字段,防止回显具体版本号、curl命令
  • 2024年5月份面试总结
  • 安卓Zygote进程详解
  • 栈与队列练习题(2024/5/31)
  • 免费生物蛋白质的类chatgpt工具助手copilot:小分子、蛋白的折叠、对接等
  • systemctl系统控制器
  • 旧衣回收小程序带来的收益优势,小程序有哪些功能?
  • A6110 轴相对振动监控器AMS 6500机械健康监测器
  • 如何完全清除docker
  • 【设计模式深度剖析】【6】【结构型】【外观模式】| 以电脑开关按钮为例,并结合微服务架构的API网关加深理解
  • AI Agent LLM相关知识
  • 从C到C++,C++入门篇(1)
  • 10-探索 Intersection Observer API:高效管理元素可见性
  • 案例实践 | 基于长安链的首钢供应链金融科技服务平台
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • centos安装java运行环境jdk+tomcat
  • gf框架之分页模块(五) - 自定义分页
  • Java精华积累:初学者都应该搞懂的问题
  • jquery cookie
  • LeetCode18.四数之和 JavaScript
  • LeetCode算法系列_0891_子序列宽度之和
  • mongo索引构建
  • Redux 中间件分析
  • Ruby 2.x 源代码分析:扩展 概述
  • swift基础之_对象 实例方法 对象方法。
  • Vue--数据传输
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 欢迎参加第二届中国游戏开发者大会
  • 利用DataURL技术在网页上显示图片
  • 使用docker-compose进行多节点部署
  • 数据仓库的几种建模方法
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • ​linux启动进程的方式
  • # Java NIO(一)FileChannel
  • #70结构体案例1(导师,学生,成绩)
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • $nextTick的使用场景介绍
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二十四)Flask之flask-session组件
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (一)appium-desktop定位元素原理
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)fock函数详解
  • (转)大型网站架构演变和知识体系
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .Mobi域名介绍