Apache POI 获取字体规格

2024-03-10

我想自动调整 Excel 中的列大小,但又不会花费太多性能。 Apache POI 的内置自动调整大小非常慢(在几个小时后没有完成 100 万行)。 为了节省性能,我只想近似单元格宽度,但为此我需要字体规格。

Apache POI 有一个类叫做FontDetails,但它本身不起作用。 班上StaticFontMetrics似乎是实际加载指标的那个,但它不是公开的。 但即使将受保护的代码复制到我的工作区并使其可访问,它也无法加载字体规格。

我怎样才能获得这些指标?将要java.awt.FontMetrics总是返回准确的结果?

编辑:我在尝试获取字体的指标时得到的堆栈跟踪:

Caused by: java.lang.IllegalArgumentException: The supplied FontMetrics doesn't know about the font 'Calibri', so we can't use it. Please add it to your font metrics file (see StaticFontMetrics.getFontDetails
at ourpackagestructure.apachepoi.FontDetails.create(FontDetails.java:106)
at ourpackagestructure.apachepoi.StaticFontMetrics.getFontDetails(StaticFontMetrics.java:94)

Apache poi uses 属性字符串 https://docs.oracle.com/javase/8/docs/api/java/text/AttributedString.html and 文本布局 https://docs.oracle.com/javase/8/docs/api/java/awt/font/TextLayout.html使特殊字体的文本超出范围。

因此,只要整列采用相同的字体,最好的方法就是首先获取应存储在该列中的最长字符串。然后使用该字体获取该字符串的宽度java.awt.font.TextLayout。然后将其设置为列宽。

注意,列宽为Excel以默认字符宽度的 1/256 为单位设置。因此,除了该字体中字符串的宽度(以像素为单位)之外,您还需要默认字符的宽度来计算Excel列宽。

Example:

import java.awt.font.FontRenderContext;
import java.awt.font.TextAttribute;
import java.awt.font.TextLayout;
import java.text.AttributedString;
import java.awt.geom.Rectangle2D;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.SheetUtil;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ApachePoiGetStringWidth {

 public static void main(String args[]) throws Exception {

  String testString = "Lorem ipsum semit dolor";
  String fontName = "Calibri";
  short fontSize = 24;
  boolean italic = true;
  boolean bold = false;

  Workbook workbook = new XSSFWorkbook();
  Font font = workbook.createFont();
  font.setFontHeightInPoints(fontSize);
  font.setFontName(fontName);
  font.setItalic(italic);
  font.setBold(bold);
  CellStyle style = workbook.createCellStyle();
  style.setFont(font);

  AttributedString attributedString = new AttributedString(testString);
  attributedString.addAttribute(TextAttribute.FAMILY, font.getFontName(), 0, testString.length());
  attributedString.addAttribute(TextAttribute.SIZE, (float)font.getFontHeightInPoints());
  if (font.getBold()) attributedString.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD,  0, testString.length());
  if (font.getItalic()) attributedString.addAttribute(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE,  0, testString.length());

  FontRenderContext fontRenderContext = new FontRenderContext(null, true, true);

  TextLayout layout = new TextLayout(attributedString.getIterator(), fontRenderContext);
  Rectangle2D bounds = layout.getBounds();
  double frameWidth = bounds.getX() + bounds.getWidth();

System.out.println(frameWidth);

  Sheet sheet = workbook.createSheet();
  Row row = sheet.createRow(2);
  Cell cell = row.createCell(2);
  cell.setCellValue(testString);
  cell.setCellStyle(style);

  int defaultCharWidth = SheetUtil.getDefaultCharWidth(workbook);
  sheet.setColumnWidth(2, (int)Math.round(frameWidth / defaultCharWidth * 256));

  try (java.io.FileOutputStream out = new java.io.FileOutputStream("Excel.xlsx")) {
   workbook.write(out);
  }

  workbook.close();

 }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache POI 获取字体规格 的相关文章

  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef

随机推荐

  • 如何测试 Django 自定义模型字段?

    我正在考虑创建一些子类化 Django 模型字段 https docs djangoproject com en dev howto custom model fields 并将它们作为一个包分发PyPI http pypi python
  • 无法将实体导入数据存储模拟器

    我正在尝试将数据存储实体的备份恢复到在本地主机上运行的模拟器中 我正在使用此位置的指南https cloud google com datastore docs tools emulator export import https clou
  • 在 R 中生成移动和变量

    我怀疑这是一个有点简单的问题 有多种解决方案 但我在 R 方面仍然是一个新手 详尽的搜索并没有产生很好地说明我想做的事情的答案 由于缺乏更好的术语 我正在尝试为数据框中的变量创建 移动总和 这些将是 3 年期和 5 年期的总和 滞后一年 因
  • 如何防止特定模板的隐式模板实例化?

    我想阻止特定模板类的所有隐式模板实例化 以防止它被实例化到每个翻译单元中 看来我的选择是 Use fno 隐式模板在 gcc 的命令行上 这 抑制所有隐式模板实例化 这不是我想要的 我只想防止单个模板出现这种情况 使用C 11 外部模板 但
  • Angular 2 组件中重复的“id”属性

    Context 我正在为复选框编写一个自定义 Angular 组件 该组件呈现复选框标记和标签标记 复选框的 id 属性和标签的 for 属性都设置为组件的id财产 一个 Input到组件 以确保单击标签将切换复选框 该模板的简化版本如下所
  • 如何将 XTickLabel 重置为默认值

    在 R2010b 中 我可以通过图形编辑器将刻度标签重置为自动 但我想以编程方式将它们重置为默认值 I tried set gca XTickLabel auto 但它在每个刻度处显示 自动 有什么提示吗 你需要设置XTickLabelMo
  • 如何删除 CreateUserWizard 控件中的表标签

    如何使用 CreateUserWizard 控件而不让它呈现 html 表 我已经自定义了 CreateUserWizard 的布局 并使用 css 对其进行样式设置 由于以下原因 我的按钮距离表单太远 table 默认情况下 asp ne
  • 哪里可以下载 Eclipse 3.6 (Helios) 的 GlassFish 插件

    您能帮我下载 Eclipse 3 6 Helios 的 GlassFish 插件吗 我试过 https ajax dev java net eclipse https ajax dev java net eclipse Eclipse 中新
  • 为什么每次运行调用 Foo::getInstance() 的脚本时 PHP 都会创建一个新的单例实例?

    我怀疑 PHP 单例不是真正的单例 所以我做了一个测试 我创建了以下课程 class MySingleton private static instance private function construct error log I am
  • 将变量值从 main.py 传递到 .kv 文件

    我正在尝试获取名为的变量的值h从 main py 文件到我的 kv文件 但我得到的只是一个空白屏幕 这是我的main py class ExampleApp App def build self h SoME STRING IS HERE
  • struts2中如何调用一个action中定义的不同方法?

    我不熟悉struts2 但我知道在按名称调用操作期间 Action 中默认调用方法execute 但是如何调用同一个动作类中定义的其他方法呢 在下面的示例中 当我在ajax中设置url链接时 会调用execute 方法 如下所示 saveJ
  • 从列表内的微调器获取值

    我已经使用扩展列表活动的列表适配器创建了android应用程序 在列表中我有旋转器 我如何从列表中的旋转器获取值 告诉一些想法 谢谢进步 尝试这个 Override public void onItemSelected AdapterVie
  • 如何将所有 GitHub 机密放入环境变量中以供操作访问(在我的例子中是 powershell)?

    我读过一些类似的帖子 但似乎没有人回答这个问题 如果我知道秘密的名称 我可以将单个 GitHub 秘密设置到操作中的环境变量中 环境 PW ID0007 秘密 PW ID0007 如何在不知道秘密名称的情况下将所有秘密公开为环境变量 批量或
  • 如何避免在任何时候()“通过引用更新”?

    我想将数字变量转换为POSIXct using anytime 我的问题是anytime
  • 如何使用与 Meteor 具有传递依赖关系的 Node.js 库?

    可以在 Meteor 中使用 node js 包作为此处描述 https stackoverflow com questions 11691513 it possible use a nodejs package inside meteor
  • Grails 依赖注入在服务之外?

    我有一个 Grails 应用程序 需要运行一个可能会随着时间的推移而被替换的策略 我知道 Spring 是 Grails 的基础 所以我想知道我是否可以访问 Spring 的 IoC 容器 以便我可以在 xml 文件中外部化实际依赖项 注意
  • Hibernate @PreUpdate:检查已更改的内容

    问题 如何检查注释的方法内哪些字段已更改 PreUpdate 可选 如果上述问题的答案是 不可能 那么也许还有其他方法可以解决我的问题 I want自动更新modified Tourist每次我们改变它的字段时 除了情况当我们只修改loca
  • Laravel 4 测试; “phpunit”无法识别?

    http four laravel com docs testing http four laravel com docs testing说 安装新的 Laravel 应用程序后 只需运行phpunit在命令行上运行测试 phpunit无法
  • 如何将一个 DialogFragment 提升到另一个之上?

    假设我有几个对话框片段 它们是为了响应可以以任何顺序到达的消息和事件而显示的 通常 最后显示的对话框将位于顶部 有没有办法显示对话框片段under是现有的 还是在显示后更改其 z 顺序 我的应用程序一次显示多个对话框的情况应该很少见 但这种
  • Apache POI 获取字体规格

    我想自动调整 Excel 中的列大小 但又不会花费太多性能 Apache POI 的内置自动调整大小非常慢 在几个小时后没有完成 100 万行 为了节省性能 我只想近似单元格宽度 但为此我需要字体规格 Apache POI 有一个类叫做Fo