首页 > 其他分享 >Apache POI读取单元格多文本多样式

Apache POI读取单元格多文本多样式

时间:2023-07-21 14:55:20浏览次数:42  
标签:textContent String 多样式 单元格 文本 start POI font textHead

需求:读取excel单元格数据(文本和部分样式),并拼接成html代码。

代码实现


 /**
  * 工作簿
  */
 private Workbook wb;
 /**
  * 导入的excel类型
  */
 private String excelType;
 /**
  * 2003-2007版本
  */
 private static final String EXCEL_TYPE_2003 = "xls";
 /**
  * 2007以后版本
  */
 private static final String EXCEL_TYPE_2007 = "xlsx";

 /**
  * 实现方法
  * 将单元格内容转为html格式
  */
 public String getCellToHtml(Cell cell){
     // 遍历每个文本片段
     StringBuilder htmlCode = new StringBuilder();
     //2003-2007版本的excel文件
     if(ObjectUtil.equals(EXCEL_TYPE_2003, this.excelType)) {
         HSSFRichTextString hssfRichText = (HSSFRichTextString) cell.getRichStringCellValue();
         //多文本多样式
         int nextEnd = 0; //上一次结束索引
         for (int i = 0; i < hssfRichText.numFormattingRuns(); i++) {
             int start = hssfRichText.getIndexOfFormattingRun(i);
             int end = hssfRichText.length();
             String textHead = StringPool.EMPTY;
             if (i + 1 < hssfRichText.numFormattingRuns()) {
                 end = hssfRichText.getIndexOfFormattingRun(i + 1);
             }
             //HSSFRichTextString.numFormattingRuns()获取不到单元格头文本样式,这时候文本样式取单元格样式
             if(start > nextEnd){
                 textHead = hssfRichText.getString().substring(nextEnd, start);
                 Font fontHead = wb.getFontAt(cell.getCellStyle().getFontIndexAsInt());
                 textHead = unionHtmlStyleFormFont(fontHead, textHead, null);
             }
             nextEnd = end;
             // 获取文本片段
             String  textContent = hssfRichText.getString().substring(start, end);
             // 获取文本片段样式
             Font font = wb.getFontAt(hssfRichText.getFontAtIndex(start));
             textContent = unionHtmlStyleFormFont(font, textContent, textHead);
             htmlCode.append(textContent);
         }
     }
     //2007以后的excel版本
     else {
         XSSFRichTextString xssfRichText = (XSSFRichTextString) cell.getRichStringCellValue();
         for (int i = 0; i < xssfRichText.numFormattingRuns(); i++) {
             int start = xssfRichText.getIndexOfFormattingRun(i);
             int end = xssfRichText.length();
             String textHead = StringPool.EMPTY;
             if (i + 1 < xssfRichText.numFormattingRuns()) {
                 end = xssfRichText.getIndexOfFormattingRun(i + 1);
             }
             String  textContent = xssfRichText.getString().substring(start, end);
             //XSSFRichTextString.numFormattingRuns()获取不到富文本头文本样式,这时候文本样式取单元格样式
             if(start == 0){
                 Font font = wb.getFontAt(cell.getCellStyle().getFontIndexAsInt());
                 textContent = unionHtmlStyleFormFont(font, textContent, textHead);
             }else{
                 XSSFFont font = xssfRichText.getFontAtIndex(start);
                 textContent = unionHtmlStyleFormFont(font, textContent, textHead);
             }
             htmlCode.append(textContent);
         }
     }
     //单元格文本只存在一种样式
     if(cell.getRichStringCellValue().numFormattingRuns() == 0){
         Font font = wb.getFontAt(cell.getCellStyle().getFontIndexAsInt());
         String  textContent = cell.getRichStringCellValue().getString();
         textContent = unionHtmlStyleFormFont(font, textContent, null);
         htmlCode.append(textContent);
     }

     if(StringUtils.isNotBlank(htmlCode)) {
         return  "<p>" + htmlCode + "</p>";
     }
     return null;
 }

 /**
  * 拼接html样式(根据具体业务需求实现)
  */
 private String unionHtmlStyleFormFont(Font font, String textContent, String textHead){
     //加粗
     if(font.getBold()){
         textContent = "<strong>" + textContent + "</strong>";
     }
     //斜体
     if(font.getItalic()){
         textContent = "<em>" + textContent + "</em>";
     }
     //上下标
     switch (font.getTypeOffset()){
         case Font.SS_SUPER:
             textContent = "<sup>" + textContent + "</sup>";
             break;
         case Font.SS_SUB:
             textContent = "<sub>" + textContent + "</sub>";
         default:
             break;
     }
     //水平删除斜线
     if(font.getStrikeout()){
         textContent = "<span style=\"text-decoration: line-through;\">" + textContent + "</span>";
     }
     //下划线
     if(font.getUnderline() == Font.U_SINGLE){
         textContent = "<span style=\"text-decoration: underline;\">" + textContent + "</span>";
     }
     if(StringUtils.isNotBlank(textHead)){
         textContent = textHead + textContent;
     }
     return textContent;
 }

标签:textContent,String,多样式,单元格,文本,start,POI,font,textHead
From: https://www.cnblogs.com/IamHzc/p/17571353.html

相关文章

  • poi导出excel加水印,单元格可修改 java 下载生成Excel文件添加水印
    poi导出excel加水印,单元格可修改java下载生成Excel文件添加水印原文链接:https://blog.csdn.net/weixin_40077255/article/details/112848376目录poi导出excel加水印,单元格可修改(只支持XSSFWorkbook)引入的jar包:操作水印的工具类:最终效果 小提示poi导出excel加水印......
  • 用Power Automate获取SharePoint文件内容
    1.根据文件夹路径获取路径下所有文件内容使用SharePoint连接器的“获取文件(仅属性)”操作,站点地址选SharePoint的默认站点,库名选择对应文档库,我这里把SharePoint集成到Dynamics365的实体附件,库名就是对应的实体名。仅限文件夹条目为 /entityname/relativeurl,entityname为实体名,r......
  • 每N行合并单元格 LoopMergeStrategy
    对每N行合并单元格LoopMergeStrategy对1到11列(下标从0开始)每6行合并  EasyExcel.write(file).head(title).registerWriteHandler(newLoopMergeStrategy(6,0)).registerWriteHandler(newLoopMergeStrategy(6,1))......
  • 项目启动时报:Method breakpoints may dramatically slow down debugging
    一、问题故障Methodbreakpointsmaydramaticallyslowdowndebugging.翻译:方法断点可能会大大降低调试速度。描述:说明当前项目中在某些方法和接口上打了断点导致执行延迟。二、错误打断点方式合理的打断点,那么标识号是圆圈的。错误的为菱形。三、解决方案总体来说就......
  • poi
    poi技术1:poi技术简介ApachePOI是用Java编写的免费开源的跨平台的JavaAPI,ApachePOI提供API给Java程序对MicrosoftOffice格式档案读和写的功能,其中使用最多的就是使用POI操作Excel文件(1)poi坐标<dependency><groupId>org.apache.poi</groupId><artifactId>poi-......
  • R语言泊松Poisson回归模型分析案例|附代码数据
    原文链接:http://tecdat.cn/?p=2605最近我们被客户要求撰写关于泊松Poisson回归的研究报告,包括一些图形和统计输出。这个问题涉及马蹄蟹研究的数据。研究中的每只雌性马蹄蟹都有一只雄性螃蟹贴在她的巢穴中。这项研究调查了影响雌蟹是否有其他男性居住在她附近的因素。被认为影......
  • 【linux】gcc编译选项:-fomit-frame-pointer,-fno-tree-vectorize,-fno-strict-aliasing
    Date:2018.9.81、参考https://www.cnblogs.com/islandscape/p/3444122.htmlhttps://blog.csdn.net/chdhust/article/details/8462414https://gcc.gnu.org/onlinedocs/gcc-6.2.0/gcc.pdfhttps://blog.csdn.net/u012927281/article/details/50999138https://blog.csdn.net/sof......
  • java语言apache.poi对word相关操作
    packagecom.xxx.business.utils;importcom.alibaba.fastjson.JSONObject;importcom.deepoove.poi.xwpf.NiceXWPFDocument;importcom.xxx.business.course.domain.*;importcom.xxx.business.utils.UtilTools;importcom.xxx.business.utils.domain.JudgeRule;impor......
  • 使用Power Automate上传附件到Dynamics 365集成的SharePoint
      在Dynamics365中使用SharePoint集成做实体的附件管理,这里不像用Annotation实体存放附件可以直接用代码直接创建Annotation记录,如果想要对外部提供接口把附件上传到SharePoint,我们可以使用PowerAutomate中的SharePoint组件来生成文件,通过HTTP流供给外部系统调用。  下......
  • P3422 [POI2005] LOT-A Journey to Mars
    前言传送门blog长沙市一中暑假第一次思维训练。前置芝士前缀和单调队列思路在考试过程中突然发现与好消息,坏消息题目大致相同,不同之处只有这个可以往逆时针方向走,以此确定本题算法——前缀和与单调队列。首先我们可以算出每一个站点可以拿到的油$p_i-d_i$,也就是油量$......