需求

要导出一个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. 洛谷——P2368 EXCEEDED WARNING B

    P2368 EXCEEDED WARNING B 题目背景 SGU 107 题目描述 求有多少个平方后末尾为987654321的n位数 输入输出格式 输入格式: 整数n 输出格式: 答案,即[b]“平 ...

  2. Laravel 使用firstOrCreate 报错MassAssignmentException

    今天尝试使用firstOrCreate去优化一段查找不到即创建的代码,结果发现会报MassAssignmentException错误,提示我参数错误,去网上找了好久没有找到结果,最后庆幸自己解决了,把 ...

  3. 关于UIWebView设置高度自适应的问题

    - (void)viewDidLoad { [super viewDidLoad]; _scrollView = [[UIScrollView alloc]initWithFrame:CGRectMa ...

  4. linux下批量更改一个目下的目录和文件的权限

    对于网站目录我们一般设置目录的权限是755, 而文件的权限是644  ,上传目录另设 比如我们要设置web目录下的所有目录的权限是755,文件的目录是644,那么我们可以批量修改吗?答案是肯定的, 就 ...

  5. microsoft-sql-server release-notes

    https://docs.microsoft.com/en-us/sql/release-notes/microsoft-sql-server

  6. 阅读 Android源码的一些姿势

    日常开发中怎么阅读源码 找到正确的源码 IDE 是日常经常用的东西,Eclipse 就不说了,直接从 Android Studio(基于 IntelliJ Community 版本改造)开始. 我们平 ...

  7. window.onerror事件用来自定义错误处理

    Event reference:      https://developer.mozilla.org/en-US/docs/Web/Events http://w3c.github.io/html/ ...

  8. 倍福TwinCAT(贝福Beckhoff)基础教程2.0 TwinCAT常用快捷键

    F5:运行程序 CTRL+F5:停止运行当前程序 F12:登出 F11:登录 CTRL+F7:强制写入数值     更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.you ...

  9. const 使用方法具体解释

    const使用方法具体解释 面向对象是C++的重要特性.  可是c++在c的基础上新添加的几点优化也是非常耀眼的 就const直接能够代替c中的#define 下面几点非常重要,学不好后果也也非常严重 ...

  10. C# Redis Server分布式缓存编程(一)

    这篇文章我将介绍如果用最简洁的方式配置Redis Server, 以及如何使用C#和它交互编程 一. 背景介绍 Redis是最快的key-value分布式缓存之一 缺点: 没有本地数据缓冲, 目前还没 ...