首页 > 其他分享 >Apache POI excel导出(单元格html代码渲染)

Apache POI excel导出(单元格html代码渲染)

时间:2023-07-24 17:45:15浏览次数:32  
标签:copyFont Font 单元格 excel startIndex html richTextString workbook font

需求:将渲染后的html代码,导出到单元格中。

依赖

<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.8.2</version>
</dependency>

代码实现

public class ExcelUtil {

    /**
     * 设置单元格富文本值
     */
    public static void setCellRichTextString(Workbook wb, Cell cell, Object obj, boolean isHead){
        if(obj == null){
            cell.setCellValue(StringPool.EMPTY);
            return;
        }
        String htmlCode = (String) obj;
        Document document = Jsoup.parse(htmlCode);
        //获取html文本内容
        StringBuilder htmlCodeStrSb = new StringBuilder();
        //前端特殊字符组件每个<p>标签为一行
        Elements allP = document.select("p");
        for (Element p : allP) {
            htmlCodeStrSb.append(p.text());
            htmlCodeStrSb.append("\n");
        }
        htmlCodeStrSb.deleteCharAt(htmlCodeStrSb.length() - 1);
        //对于表格头不需要进行字体样式渲染
        if(isHead){
            cell.setCellValue(htmlCodeStrSb.toString());
            return;
        }
        //html转为RichTextString
        RichTextString richTextString = ExcelUtil.convertToRichTextString(wb, document.body(), htmlCodeStrSb.toString());
        cell.setCellValue(richTextString);

    }



    public static RichTextString convertToRichTextString(Workbook workbook, Element element, String htmlCode) {
        RichTextString richTextString = new HSSFRichTextString(htmlCode);
        int startIndex = 0;
        for (Node node : element.childNodes()) {
            Font font = workbook.createFont();
            startIndex = applyFontRecursive(workbook, richTextString, node, startIndex, font);
        }
        return richTextString;
    }

    public static int applyFontRecursive(Workbook workbook, RichTextString richTextString,
                                         Node node, int startIndex, Font parentFont) {
        if (node instanceof TextNode) {
            TextNode textNode = (TextNode) node;
            String text = textNode.getWholeText();
            if (!text.isEmpty()) {
                startIndex = startIndex + text.length();
            }
        } else if (node instanceof Element) {
            Element childElement = (Element) node;
            String tagName = childElement.tagName();
            Font font = copyFont(workbook, parentFont);
            switch (tagName) {
                case "strong": //加粗
                    font.setBold(true);
                    break;
                case "em": //斜体
                    font.setItalic(true);
                    break;
                case "sup": //上标
                    font.setTypeOffset(Font.SS_SUPER);
                    break;
                case "sub": //下标
                    font.setTypeOffset(Font.SS_SUB);
                    break;
                case "span":
                    String style = childElement.attr("style");
                    if(StringUtils.isNotBlank(style)) {
                        if (style.contains("text-decoration: line-through;")) {  //水平删除斜线
                            font.setStrikeout(true);
                        }
                        if (style.contains("text-decoration: underline;")) { //下划线
                            font.setUnderline(Font.U_SINGLE);
                        }
                    }
                default:
                    break;
            }
            richTextString.applyFont(startIndex, startIndex + ((Element) node).text().length(), font);
            for (Node childNode : childElement.childNodes()) {
                startIndex = applyFontRecursive(workbook, richTextString, childNode, startIndex, font);
            }
        }
        return startIndex;
    }

    /**
     * 拷贝字体
     */
    public static Font copyFont(Workbook workbook, Font font){
        Font copyFont = workbook.createFont();
        copyFont.setBold(font.getBold());
        copyFont.setItalic(font.getItalic());
        copyFont.setStrikeout(font.getStrikeout());
        copyFont.setUnderline(font.getUnderline());
        copyFont.setTypeOffset(font.getTypeOffset());
        return copyFont;
    }



}

标签:copyFont,Font,单元格,excel,startIndex,html,richTextString,workbook,font
From: https://www.cnblogs.com/IamHzc/p/17577871.html

相关文章

  • 修改 Joomla! 1.5 的 HTML 输出而不动核心文件 (附api文档)
    现在到了Joomla!1.5平台,前面这个方法不灵了。不过,Joomla!开发团队早就给出了更好的方案,总结起来就是3个字母:MVC。  MVCinphpProgramming MVC等几个概念     MVC是Model-View-Controller(模型-视图-控制器)的缩写。这是Joomla!1.5采纳的一种新型的......
  • 前端拿到后端返回文件流后页面生成excel表格预览(Luckysheet)
    最近项目遇到一个需求,就是本来只需要导出的excel文件,客户要求在前端页面进行预览查看。在查找资料后,决定使用Luckysheet来进行excel文件的预览。1.安装npmiluckyexcel2.html中引入相关js,css文件,可以自己下下来放到本地引入<linkrel='stylesheet'href='https://cdn.......
  • 浅析html5的dataset
     前言: 很多时候,我们在操作页面某些元素的时候,需要存储一些数据,一般大家很常见的方式都会设置一些自定义属性,比如: 微博feedlist里面的图片放大:  大家看到有一个自定义的key------action-data,里面存储了一些数据。  那问题来了: 自定义属性命名有没有规范或者标准??获取......
  • html 之 jQuery库
    一、jQuery介绍1、库就类似于是Python中的模块,简称为jq2、jQuery就是js、css等的封装版本,只要一封装,写法较简单3、jQuery是一个轻量级的、兼容多浏览器的JavaScript库,封装版本的js。4、jq的优势简化DOM操作:jQuery提供了简单易用的选择器和DOM操作方法,使得在HTML文......
  • .net core 解析Html辅助类
    .NETCore解析HTML辅助类实现流程为了实现.NETCore解析HTML的辅助类,我们需要按照以下步骤进行操作:步骤描述1安装必要的NuGet包2创建HTML解析类3实现解析HTML的方法下面我们来看具体的实现步骤和每一步需要做的事情。1.安装必要的NuGet包首先,我们需要......
  • 详解Python对Excel处理
    Excel是一种常见的电子表格文件格式,广泛用于数据记录和处理。Python提供了多个第三方库,可以方便地对Excel文件进行读写、数据操作和处理。本文将介绍如何使用Python对Excel文件进行处理,并提供相应的代码示例和详细说明。一、安装第三方库在开始之前,我们需要安装一些Python第三......
  • 让你一天就可以掌握HTML5的基础
    HTML5一直是非常热门的话题,因此此系列文章主要从一些基本功能开始讲起,逐步深入了解HTML5的新概念。 首先了解一些基本的术语和概念。SGML,HTML,XML三者之间的区别Doc类型是什么HTML5有什么新特点新优势。学习HTML5 在开始之前首先来区分SGMC,HTML,XML三者......
  • 解决python解析Excel文件报错xlrd.biffh.XLRDError: Excel xlsx file; not supported
    报错如下:解决方案:1、安装低版本xlrdpipinstallxlrd==1.2.02、Excel另存为的时候将后缀改为.xls文件再修改代码的文件后缀即可,高版本的xlrd模块依旧支持读取.xls文件参考文章:https://blog.csdn.net/yuan2019035055/article/details/128408178......
  • Springboot 整合mybatis 加导出excel
    快速写一个springboot,mybatis的demo,最后用excel导出。第一步,创建一个新maven命名就按自己的来啦第二步,配置pom文件<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version&g......
  • HTML | HTML列表
    1.有序列表概念:有顺序或侧重顺序的列表。<h2>要把大象放冰箱总共分几步</h2><ol><li>把冰箱门打开</li><li>把大象放进去</li><li>把冰箱门关上</li></ol>2.无序列表概念:无顺序或不侧重顺序的列表。<h2>我想去的几个城市</h2><ul><li>成都</li>......