需求

要导出一个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);
}
}

NPOI 计算单元格高度的更多相关文章

  1. 【转】NPOI 单元格级别应用

    NPOI 单元格级别应用A HSSFWorkbook hssfworkbook = new HSSFWorkbook();//初始化一个新的HSSFWorkbook实例 //#region 1.创建一 ...

  2. iOS开发——Autolayout下动态调整单元格高度

    情景描述: 有时候我们希望更新某一个单元格的数据,通常的做法是使用reloadData方法更新整个单元格.但是对一些情况是不适用的或者说实现起来比较麻烦.比如说这种简单的"点开"一 ...

  3. NPOI 单元格(cell) 格式参数

    NPOI 单元格(cell) 将格式设为文本 在网上找了很久,都没有关于如何设置的信息,没办法查了下NPOI的源码终于找到了方法.这里共享下,就是“@”参数 ICellStyle cellStyle ...

  4. NPOI2.2.0.0实例详解(十)—设置EXCEL单元格【文本格式】 NPOI 单元格 格式设为文本 HSSFDataFormat

    NPOI2.2.0.0实例详解(十)—设置EXCEL单元格[文本格式] 2015年12月10日 09:55:17 阅读数:3150 using System; using System.Collect ...

  5. [转]NPOI 单元格级别应用

    原文地址:http://hi.baidu.com/linrao/item/fadf96dce8770753d63aaef2 HSSFWorkbook hssfworkbook = new HSSFWo ...

  6. iOS单元格高度计算

    // Created by mac on 16/6/29. // Copyright © 2016年 zcc. All rights reserved. // #import "HotCel ...

  7. [Xcode 实际操作]五、使用表格-(2)设置UITableView单元格高度

    目录:[Swift]Xcode实际操作 本文将演示如何制作一个自定义行高的表格视图 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //首 ...

  8. 【POI xls Java map】使用POI处理xls 抽取出异常信息 --java1.8Group by ---map迭代 -- 设置单元格高度

    代码处理逻辑: 代码流程: 1.首先需要创建一个实体 用来存储 相关信息 package com.sxd.test.unusualName; public class NameEntity { pri ...

  9. vue+element 根据内容计算单元格的宽度

    需求是这样的,之前我也写过,就是前端渲染的表格数据是动态渲染表格的行和列, 那么就必然出现了一个问题,当列超过一定的个数的时候,会出现横向滚动条, 那么怎么让表格整体看起来自然协调一些呢,老大要求表格 ...

随机推荐

  1. Python的功能模块[0] -> wmi -> 获取 Windows 内部信息

    wmi模块 / wmi Module WMI (Windows Management Instrumentation) 模块可用于获取 Windows 内部信息.该模块需要 win32com 的支持, ...

  2. spark-join算子

  3. 贪心+数学【p3156】 [CQOI2011]分金币 ([HAOI2008]糖果传递)

    题目描述 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. 分析: 设: 每个人最 ...

  4. .xcodeprok cannot be opened because the project file cannot be parsed

    用svn更新代码后,打开xcode工程文件出现 xxx..xcodeproj cannot be opened because the project file cannot be parsed. 这 ...

  5. linux-网络监控命令-netstat初级

    简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Member ...

  6. 前端JavaScript实现跨域的方式(转)

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  7. linux命令详解:basename命令

    转:http://www.cnblogs.com/lwgdream/archive/2013/11/05/3407768.html 前言 bashname命令用于获取路径中的文件名或路径名(获取的时候 ...

  8. JAVA生成问答式验证码图片,支持加减算法

    原文:http://liuguihua0823.iteye.com/blog/1511355 import java.awt.Color; import java.awt.Font; import j ...

  9. Vue.js常用指令汇总(v-if//v-show//v-else//v-for//v-bind//v-on等)

    有时候指令太多会造成记错.记混的问题,所以本文在记忆的时候会采用穿插记忆的方式,交叉比对,不易出错. 本文主要讲了一下六个指令: v-if//v-show//v-else//v-for//v-bind ...

  10. easyui numberbox precision属性

    //设置easyui numbox 最小值为0,保留2为小数 <input id="payPrice" type="text" name="pa ...