为啥还要写这个呢?

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

核心代码

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. Linux命令——expr
  2. 互联网协议 — TCP — 拥塞控制(网络质量保障)
  3. 【AutoML】进化算法如何用于自动模型搜索(NAS)
  4. python算法与数据结构-冒泡排序算法
  5. 只使用了符号的Ruby程序
  6. C# 运行时通过鼠标拖动改变控件的大小
  7. ubuntu下安装phpredis的模块扩展
  8. Python笔记-使用U2滑动APP
  9. java se 8 新特性_javase8-sample
  10. jquery选择器之过滤选择器
  11. 基于SSM流浪宠物管理系统
  12. Python 高阶函数,匿名函数 思维导图
  13. 实现sqrt()平方根函数
  14. can收发器TJA1043
  15. 图像超分变率与分辨率
  16. java根据文件字符换行_java操作txt文本(一):遇到指定字符换行
  17. 首届百度Apollo生态大会为什么选择长沙?
  18. 微信公众平台菜单编辑php,Vue.js实现微信公众号菜单编辑器步骤详解(上)
  19. 华为部分通知气泡显示_华为P50已在路上,目前不受美国影响 | PS5价格曝光!
  20. (div,p)等标签之间“分割线”的两种实现方式

热门文章

  1. ubantu 安装显卡
  2. 开放大学建筑构造计算机考试试题,精编最新国家开放大学电大《建筑构造》形考任务2试题及答案...
  3. The Geodetic Set Problem UVA - 1198
  4. 中冠百年|上班族如何增加自己的收入
  5. ChatGPT中文网
  6. (8.1.5.5)Android Testing Support Library翻译之Espresso 意图
  7. STC8A,STC8G,STC8H系列的IRC内部振荡源频率调节
  8. ESP8266-Arduino编程实例-APDS-9930环境光和趋近感器驱动
  9. python绘制横向柱状图 妈妈再也不用担心我不会画图了
  10. Java实现调用默认浏览器打开网址