为啥还要写这个呢?

因为有上标下标的单元格 有些字体的样式没有变,所以有了部分样式修改。

核心代码

text.applyFont()用这个api 对不同位置的字体用不同的样式即可。

// 上标

HSSFFont ft = workbook.createFont();

ft.setTypeOffset(HSSFFont.SS_SUPER);

// 加粗

HSSFFont font = workbook.createFont();

font.setBold(true);

font.setFontHeightInPoints((short) 10);

for (int[] pair : sups) {

text.applyFont(pair[0], pair[1], ft);

text.applyFont(pair[1], title.length(), font);

}

例子

image.png

public static void main(String[] args) {

String title = "一种F-、Zn2+、B3+离子协同掺杂电解质,H2O是水";

List> tagIndexArr = null;

if (containSubSup(title)) {

tagIndexArr = new ArrayList<>();

title = getSubSupIndexs(title, tagIndexArr);

}

//TODO 文件路径自己改

File f = new File("C:test.xls");

try {

FileOutputStream fout = new FileOutputStream(f);

// 声明一个工作薄

@SuppressWarnings("resource")

HSSFWorkbook workbook = new HSSFWorkbook();

// 生成一个表格

HSSFSheet sheet = workbook.createSheet("sheet1");

int curRowIndex = 0;

HSSFRow row = sheet.createRow(curRowIndex);

HSSFCell cell = row.createCell(0);

if (tagIndexArr != null) {

HSSFRichTextString text = new HSSFRichTextString(title);

List subs = tagIndexArr.get(0);

List sups = tagIndexArr.get(1);

if (subs.size() > 0) {

HSSFFont ft = workbook.createFont();

ft.setTypeOffset(HSSFFont.SS_SUB);

for (int[] pair : subs) {

text.applyFont(pair[0], pair[1], ft);

}

}

if (sups.size() > 0) {

// 上标

HSSFFont ft = workbook.createFont();

ft.setTypeOffset(HSSFFont.SS_SUPER);

// 加粗

HSSFFont font = workbook.createFont();

font.setBold(true);

font.setFontHeightInPoints((short) 10);

for (int[] pair : sups) {

text.applyFont(pair[0], pair[1], ft);

text.applyFont(pair[1], title.length(), font);

}

}

cell.setCellValue(text);

} else {

cell.setCellValue(title);

}

try {

workbook.write(fout);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/**

* 获取下一对标签的index,不存在这些标签就返回null

* @param s

* @param tag SUB_START 或者SUP_START

* @return int[]中有两个元素,第一个是开始标签的index,第二个元素是结束标签的index

*/

private static int[] getNextSubsTagsIndex(String s, String tag) {

int firstSubStart = s.indexOf(tag);

if (firstSubStart > -1) {

int firstSubEnd = s.indexOf(tag.equals(SUB_START) ? SUB_END : SUP_END);

if (firstSubEnd > firstSubStart) {

return new int[] { firstSubStart, firstSubEnd };

}

}

return null;

}

/**移除下一对sub或者sup标签,返回移除后的字符串

* @param s

* @param tag SUB_START 或者SUP_START

* @return

*/

private static String removeNextSubTags(String s, String tag) {

s = s.replaceFirst(tag, "");

s = s.replaceFirst(tag.equals(SUB_START) ? SUB_END : SUP_END, "");

return s;

}

/**

* 判断是不是包含sub,sup标签

* @param s

* @return

*/

private static boolean containSubSup(String s) {

return (s.contains(SUB_START) && s.contains(SUB_END)) || (s.contains(SUP_START) && s.contains(SUP_END));

}

/**

* 处理字符串,得到每个sub,sup标签的开始和对应的结束的标签的index,方便后面根据这个标签做字体操作

* @param s

* @param tagIndexList 传一个新建的空list进来,方法结束的时候会存储好标签位置信息。

*
tagIndexList.get(0)存放的sub

*
tagIndexList.get(1)存放的是sup

*

* @return 返回sub,sup处理完之后的字符串

*/

private static String getSubSupIndexs(String s, List> tagIndexList) {

List subs = new ArrayList();

List sups = new ArrayList();

while (true) {

int[] subPair = getNextSubsTagsIndex(s, SUB_START);

int[] supPair = getNextSubsTagsIndex(s, SUP_START);

boolean subFirst = true;

boolean supFirst = true;

if(subPair != null && supPair != null) {

//两种标签都存在的时候要考虑到谁在前,在前的标签优先处理

//因为如果在后的标签处理完,index就定下来,再处理在前的,后面的index就会产生偏移量。从前开始处理不会存在这个问题

if(subPair[0] < supPair[0]) {

supFirst = false;

} else {

subFirst = false;

}

}

if (subPair != null && subFirst) {

s = removeNextSubTags(s, SUB_START);

//标签被去掉之后,结束标签需要相应往前移动

subPair[1] = subPair[1] - SUB_START.length();

subs.add(subPair);

continue;

}

if (supPair != null) {

s = removeNextSubTags(s, SUP_START);

//标签被去掉之后,结束标签需要相应往前移动

supPair[1] = supPair[1] - SUP_START.length();

sups.add(supPair);

continue;

}

break;

}

tagIndexList.add(subs);

tagIndexList.add(sups);

return s;

}

hssfrow 单元格样式_POI实现上标下标和单元格部分样式修改相关推荐

  1. hssfrow 单元格样式_poi的各种单元格样式以及一些常用的配置

    之前我做过一个poi到处excel数据的博客,但是,后面使用起来发现,导出的数据单元格样式都不对. 很多没有居中对齐,很多单元格的格式不对,还有就是单元格的大小不对,导致数据显示异常,虽然功能可以使用 ...

  2. EasyExcel 设置字体样式(字体、字体大小、字体颜色、字体加粗、字体斜体、字体下划线、字体上标下标、字体删除线)

    1 Maven配置 <!--hutool工具包--><dependency><groupId>cn.hutool</groupId><artifa ...

  3. vue导出excel表格,使用xlsx-style自定义字体样式,字体颜色,合并单元格,单元格填充色

    一.需要依赖 npm install xlsx-style --save "^0.8.13" npm install xlsx --save "^0.18.5" ...

  4. poi设置word表格单元格宽度_poi导出word表格的操作讲解

    一.效果如下 二.js代码 function export_word(){ //导出word var url = "czzsca/exportWord.do"; this.expo ...

  5. html上标下标标签 示例_带有示例HTML th表标题标签教程

    html上标下标标签 示例 HTML provides table structure which consists of rows, columns or cells. During the cre ...

  6. 【openpyxl】操作单元格,获取单个或多个单元格并修改数据、合并单元格、删除行列、移动单元格

    1.获取和修改单个单元格 from openpyxl import Workbook wb = Workbook() ws = wb.activecell = ws["a6"] # ...

  7. php单元格字体颜色,PHPExcel API接口用法大全,按模板导入excel,美化excel,导出图片,设置单元格字体颜色背景色边框,合并单元格,设置行高列宽...

    PHPExcel API接口用法大全,按模板导入excel,美化excel,导出图片,设置单元格字体颜色背景色边框,合并单元格,设置行高列宽 2020-08-31 85 一:读取excel表模板$ph ...

  8. a上标3下标6算法_a上标3下标6算法_Word中同时设置上标下标

    我们在使用Word文档的时候,经常要输入上下标,我们在这里总结一下,以后再遇到就不发愁咯. 0,瞒天过海 此方法不推荐,但是我遇到有人这样过,发出来让大家看一下. 猜猜看哪个是标准的,另个是怎么做出来 ...

  9. vue中使用xlsx导出Excel 并设置样式,解决未完全合并单元格框线的BUG

    今天有需到一个需求,需要在前端直接导出表格,将了解发现了npm上用的比较多的 xlsx 这个包,但是在使用过程中发现很多问题,下边是我将发现问题进行的汇总以及相应的解决办法. 1.安装 首先说安装问题 ...

最新文章

  1. tm matlab,[转载]关于matlab中textread
  2. html百度地图标记图标,百度地图开发之点击地图给该位置添加标注(图标)并弹出对应的位置...
  3. python 自定义模块怎么用_python自定义模块使用说明
  4. 教程Xcode 4下编译发布与提交App到AppStore
  5. Spring及SpringBoot @Async配置步骤及注意事项
  6. 比起第一代,《最后生还者2》到底做错了什么?
  7. centos 7 构造iptables开放80port
  8. 双主双从(2m-2s)集群介绍和工作流程说明
  9. windows 文件对话框
  10. 基于webview的选择滑动控件(PC和wap版)
  11. Bugku-Web-xxx二手交易市场
  12. 象棋名手手机版2019最新版_象棋名手326手机版-象棋名手增强版v6.58 安卓版-单机手游网...
  13. xp java环境_XP系统怎么安装JAVA编程环境
  14. velocity 语法简记
  15. python编写代码自动运行程序_利用Python编写自动打开指定软件的程序
  16. 软件测试面试题整理(四)之接口测试篇
  17. 车牌识别系统 HY-LPR2
  18. PHP语言系列API接口,按关键词搜索商品列表
  19. Vue脚手架、镜像源下载及使用
  20. ssm 远程监控linux,Wisenet SSM视频监控综合管理平台

热门文章

  1. 论文发表查重率要小于多少?
  2. Vue 打包后,使用火狐与谷歌可以打开index,但是IE小贱人打开空白的解决方法
  3. 计算机图形学3——Boundary-Fill Algorithm
  4. 有哪些句子,曾让你产生「我一辈子都写不出来」的想法?
  5. SystemVerilog学习总结
  6. 微信小程序优惠券列表领取(send-coupon插件)
  7. NVIDIA 显卡介绍
  8. Android Others部分内存泄漏 OOM分析
  9. 全志h2参数_全志H2怎么样 H2芯片参数介绍
  10. 西北乱跑娃 --- python xml转dict