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

该博客主要介绍了如何使用Apache POI库处理含有上标和下标样式的HSSFRow单元格。通过创建和应用不同字体样式,实现了对Excel单元格中特定部分的样式修改,包括设置上标、加粗等效果。
摘要由CSDN通过智能技术生成

为啥还要写这个呢?

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

核心代码

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;

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值