需求

要导出一个Excel,第一行是不定长字符串,合并单元格(A-G)已知,现要计算第一行的高度。

思路

已知,NPOI的宽度单位是1/256个英文字符,在本例中,A列的宽度是2048,即 2048 / 256 = 8 个英文字符。在A4单元格里也可以看出。如下图:

第一行默认的行高,正好显示一行文字。我要做的就是,计算出A-G列宽度一行能容纳的汉字数量,再根据 “行数 = 总字数 / 一行字数 ” 计算出需要的行数,设置 第一行高度 = 原高度 ✖ 行数。

接下来要解决的问题就是如何计算一行字数的问题了。这里我们可以利用C#的System.Drawing.Graphics里的MeasureString,分别获得字母的宽度,和汉字的宽度,按比例进行计算。

当然这个方法也不是绝对准确,但估算出的值对大多数情况已经够用了。

代码实现


public void SetRowHight(ISheet sheet, string text)
{
var width = 0.0; // 计算单元格长度
for (int i = 1; i <= sheet.GetRow(0).Cells.Count; i++)
{
width += sheet.GetColumnWidth(i);
} // 获取每行汉字长度
double length = Util.GetChineseLength(
sheet.Workbook.GetFontAt(0),
this.cellStyles.TipStyle.GetFont(sheet.Workbook), // 我的汉字字体
width); sheet.GetRow(0).Height = Convert.ToInt16(sheet.GetRow(0).Height * Math.Ceiling(text.Length / length));
} /// <summary>
/// 计算可容纳汉字数
/// </summary>
/// <param name="eFont">英文字体</param>
/// <param name="cFont">中文字体</param>
/// <param name="length">单元格长度</param>
/// <returns>可容纳汉字数量</returns>
public static int GetChineseLength(IFont eFont, IFont cFont, double length)
{
using (var bitmap = new Bitmap(1, 1))
{
var graphics = Graphics.FromImage(bitmap);
var size1 = graphics.MeasureString("abcdefg", new Font(eFont.FontName, eFont.FontHeightInPoints));
var size2 = graphics.MeasureString("一二三四五六七", new Font(cFont.FontName, cFont.FontHeightInPoints));
return (int)Math.Floor((length / 256) * size1.Width / size2.Width);
}
}

最新文章

  1. RocketMQ原理解析-Producer
  2. [转有改动]vi
  3. HDU-1846 Brave Game
  4. javascript 获取滚动条高度+常用js页面宽度与高度(转)
  5. Git 系列(一):什么是 Git
  6. HTML5 Placeholder实现input背景文字提示效果
  7. IOS 调用系统相册或照相机tab按钮显示中文
  8. smartforms换页,
  9. Git创建空白新分支
  10. matlab中小技巧
  11. 你要clean Android Studio project 么
  12. 转换函数TO_CHAR,TO_DATE,TO_NUMBER
  13. NOI2009 二叉查找树 【区间dp】
  14. Linux高级运维 第二章 Linux基本操作和自己动手组装服务器
  15. [UWP]为附加属性和依赖属性自定义代码段(兼容UWP和WPF)
  16. Spring源码阅读(七)
  17. 图像处理之规则裁剪(Resize)
  18. spring boot学习总结(一)-- 基础入门 Hello,spring boot!
  19. iOS手机号,身份证,车牌号正则表达式
  20. MSG命令使用详解

热门文章

  1. [ZJb417]区间众数
  2. List集合-保存和输出宠物信息
  3. Java混乱的日志体系(logback)(转)
  4. ios--计时器演示样例:一闪一闪亮晶晶(动画)
  5. 泳池水面fresnel 的近似替代
  6. ES6里关于作用域的拓展:块级作用域
  7. C#数据之List
  8. JNI 函数注册与管理
  9. hibernate学习系列-----(2)hibernate核心接口和工作机制
  10. vue相关知识点