Java POI输出excel单元格画斜线

2023-11-20

在这里插入图片描述

sheet cell画斜线

  1. 首先初始化HSSFWorkbook对象,通过此对象创建excel的一个名称为"line"的sheet, 下面是通过sheet对象创建单元格。
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("line");
  1. 通过sheet的createRow方法创建table的行,设置行高为77*PXTOPT, 77是像素值转换为poi高需要乘以0.75(PXTOPT),
    通过row创建HSSFCell对象,为HSSFCell单元格设置样式。
HSSFRow row = sheet.createRow(0);
row.setHeightInPoints(77 * PXTOPT);
HSSFCell cell = row.createCell(0);
  1. 画第一个单元格3个斜线,x1,y1,x2,y2,x3,y3为线的坐标终止位置,开始坐标是相对于当前的单元格,所以为(0,0), drawLine方法中
    i表示sheet, 行数,j表示sheet的列数,width为当前单元格的宽度,height为当前单元格的高度,HSSFClientAnchor 对象是指定在哪个单元格中画线,EscherGraphics2d对象为画笔对象,画线方法 drawLine(0,0, x, y),x、y为线的终止坐标,PERCENT_WIDTH与PERCENT_HEIGHT变量为excel中单元格宽度与高度换算值,excel中单元格宽度=PERCENT_WIDTH * 0.75 * 像素宽度。
int x1 = 61, y1 = 77;
int x2 = 132, y2 = 76;
int x3 = 144, y3 = 31;
int[] xys = { x1, y1, x2, y2, x3, y3 };
drawLine(sheet, row, 0, 0, 144, 77, xys);
 
// draw cell line
private static void drawLine(HSSFSheet sheet, HSSFRow row, int i, int j, int width, int height,
    int[] xys) {
int cellWidth = (int) (PERCENT_WIDTH * PXTOPT * width);
short cellHeight = (short) (PERCENT_HEIGHT * PXTOPT * height);
sheet.setColumnWidth(j, cellWidth);
row.setHeight(cellHeight);
 
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
HSSFClientAnchor a = new HSSFClientAnchor(0, 0, 1023, 255, (short) j, i, (short) (j), i);
HSSFShapeGroup group = patriarch.createGroup(a);
float verticalPointsPerPixel = a.getAnchorHeightInPoints(sheet);
EscherGraphics g = new EscherGraphics(group, sheet.getWorkbook(), Color.black,
        verticalPointsPerPixel);
EscherGraphics2d g2d = new EscherGraphics2d(g);
 
for (int l = 0; l < xys.length; l += 2) {
    int x = (int) ((PERCENT_WIDTH * 0.75 * xys[l] / cellWidth) * 1023);
    int y = (int) ((PERCENT_HEIGHT * 0.75 * xys[l + 1] / cellHeight) * 255);
    g2d.drawLine(0, 0, x, y);
  }
}
  1. 画最后一个单元格的一个斜线,这是i=1,j=3,第二行第四列单元格,斜线开始坐标为(0,0),终止坐标为(112,83)
int[] xys1 = { 112, 83 };
drawLine(sheet, row, 1, 3, 110, 83, xys1);

完整示例
下面是输出excel斜线完整的示例代码,使用的poi类库为:poi-3.8.jar

import java.awt.Color;
import java.io.FileOutputStream;
 
import org.apache.poi.hssf.usermodel.EscherGraphics;
import org.apache.poi.hssf.usermodel.EscherGraphics2d;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFShapeGroup;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
public class TestExcel {
 
    public static final int PERCENT_WIDTH = 50;
    public static final int PERCENT_HEIGHT = 20;
 
    public static final float PXTOPT = 0.75f;
 
    public static void main(String[] args) throws Exception {
        FileOutputStream fos = new FileOutputStream("D:/line.xls");
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet("line");
 
        HSSFRow row = sheet.createRow(0);
        row.setHeightInPoints(77 * PXTOPT);
 
        final String text = "                       AB\n\n\n CD";
        HSSFCell cell = row.createCell(0);
        HSSFCellStyle cellStyle = getCellFormat(wb);
        int x1 = 61, y1 = 77;
        int x2 = 132, y2 = 76;
        int x3 = 144, y3 = 31;
        int[] xys = { x1, y1, x2, y2, x3, y3 };
        drawLine(sheet, row, 0, 0, 144, 77, xys);
        cell.setCellValue(text);
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_TOP);
        cell.setCellStyle(cellStyle);
 
        cell = row.createCell(1);
        cell.setCellStyle(cellStyle);
 
        cell = row.createCell(2);
        cell.setCellStyle(cellStyle);
 
        cell = row.createCell(3);
        cell.setCellStyle(cellStyle);
 
        row = sheet.createRow(1);
        row.setHeightInPoints(83 * PXTOPT);
        cell = row.createCell(0);
        cell.setCellStyle(cellStyle);
 
        cell = row.createCell(1);
        cell.setCellStyle(cellStyle);
 
        cell = row.createCell(2);
        cell.setCellStyle(cellStyle);
 
        cell = row.createCell(3);
        cell.setCellStyle(cellStyle);
 
        int[] xys1 = { 112, 83 };
        drawLine(sheet, row, 1, 3, 110, 83, xys1);
 
        wb.write(fos);
    }
 
    // draw cell line
    private static void drawLine(HSSFSheet sheet, HSSFRow row, int i, int j, int width, int height,
            int[] xys) {
        int cellWidth = (int) (PERCENT_WIDTH * PXTOPT * width);
        short cellHeight = (short) (PERCENT_HEIGHT * PXTOPT * height);
        sheet.setColumnWidth(j, cellWidth);
        row.setHeight(cellHeight);
 
        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
        HSSFClientAnchor a = new HSSFClientAnchor(0, 0, 1023, 255, (short) j, i, (short) (j), i);
        HSSFShapeGroup group = patriarch.createGroup(a);
        float verticalPointsPerPixel = a.getAnchorHeightInPoints(sheet);
        EscherGraphics g = new EscherGraphics(group, sheet.getWorkbook(), Color.black,
                verticalPointsPerPixel);
        EscherGraphics2d g2d = new EscherGraphics2d(g);
 
        for (int l = 0; l < xys.length; l += 2) {
            int x = (int) ((PERCENT_WIDTH * 0.75 * xys[l] / cellWidth) * 1023);
            int y = (int) ((PERCENT_HEIGHT * 0.75 * xys[l + 1] / cellHeight) * 255);
            g2d.drawLine(0, 0, x, y);
        }
    }
 
    public static HSSFCellStyle getCellFormat(HSSFWorkbook wb) {
        HSSFCellStyle cellStyle = wb.createCellStyle();
        if (cellStyle.getBorderBottom() != HSSFCellStyle.BORDER_THIN) {
            cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        }
        if (cellStyle.getBorderLeft() != HSSFCellStyle.BORDER_THIN) {
            cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        }
        if (cellStyle.getBorderTop() != HSSFCellStyle.BORDER_THIN) {
            cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
        }
        if (cellStyle.getBorderRight() != HSSFCellStyle.BORDER_THIN) {
            cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        }
        cellStyle.setBottomBorderColor(createPette(wb));
        cellStyle.setLeftBorderColor(createPette(wb));
        cellStyle.setRightBorderColor(createPette(wb));
        cellStyle.setTopBorderColor(createPette(wb));
        return cellStyle;
    }
 
    public static short createPette(HSSFWorkbook wb) {
        short petteIndex = 0;
        Color rgb = new Color(0x00, 0x00, 0x00);
        HSSFPalette palette = wb.getCustomPalette();
        palette.setColorAtIndex(petteIndex, (byte) rgb.getRed(), (byte) rgb.getGreen(), (byte) rgb
                .getBlue());
        return petteIndex;
    }
}

原文地址:http://www.anyrt.com/blog/list/poiline.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java POI输出excel单元格画斜线 的相关文章

  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • 绝!OpenAI 年底上新,单卡 1 分钟生成 3D 点云,text-to 3D 告别高算力消耗时代

    内容一览 继 DALL E ChatGPT 之后 OpenAI 再发力 于近日发布 Point E 可以依据文本提示直接生成 3D 点云 关键词 OpenAI 3D 点云 Point E OpenAI 年底冲业绩 半个多月前发布的 Chat
  • 20篇必读论文!2023世界人工智能大会青年优秀论文奖公示

    2023年2月 关于推荐 2023世界人工智能大会青年优秀论文奖 参评论文的通知 发布 面向全球高校 科研院所 企业开展人工智能领域青年优秀论文征集活动 至征稿截止 共收到海内外参评论文235篇 包括国际相关知名高校 科研机构 企业 经初评
  • Postfix 554 5.7.1 Relay Access Denied

    D678453B4C672EB0 716 entry Postfix 554 5 7 1 Relay Access DeniedPostfix 安装后想在 Windows 或者 Linux 用邮件程序 Outlook或者Evolution等
  • 结构体排序问题

    题目如下 刚刚看到这道题的时候一点点思路都没有 连题目都没读懂 include
  • 非阻塞connect问题

    在发起一个网络连接时 如果不知道服务器是否正常 我们经常会阻塞在connect 在 linux网络编程 一书中讲述了使用select 实现非阻塞connect的方法 基本步骤如下 1 创建 socket 返回套接字描述符 2 调用 fcnt
  • vue pc端 输入验证码_云顶之奕手游国际服拳头riot账号注册验证码怎么点,出错解决方法...

    首先上图看下这个烦人的验证码 云顶之弈手游验证码 是不是点了N遍也点不对 今天我来告诉你怎么点 学会之后估计还是很难点对 其实 操作很简单 见上图 1 查看提示物 斑马线 消防栓 小汽车 公交车 山 树 烟囱等 2 点选对应图片 可能点完之
  • dataframe 使用拉格朗日插值填充缺失值

    本例中代码使用 jupyter 运行 问题场景 在处理dataframe时 可能会遇到少量数据缺失的情况 在连续缺失数据较少的情况可以考虑插值填充 本文调用了scipy库的lagrange x y 这个函数 参数x y分别是对应各个点的x值
  • Java 简单修饰符补充学习笔记(基础)

    前言 顾名思义 这里是补充修饰符的学习笔记 通配符 顾名思义即可 const 常变量修饰符 首先const是constant 恒定不变的 的缩写 const 就是描述变量为常量的修饰符 关键字 或者说 const 是定义常变量的关键字 用
  • Screen 对象

    解释 Screen 对象包含有关客户端显示屏幕的信息 Screen 对象属性 属性 说明 availHeight 返回屏幕的高度 不包括Windows任务栏 availWidth 返回屏幕的宽度 不包括Windows任务栏 colorDep
  • Docker容器网络

    一 虚拟化网络 Docker 镜像启动容器 默认Docker 容器可以直接访问互联网 前提 宿主机能够上外网 Docker 容器的IP 专属IP段 默认跟宿主机不在同网段 Docker Engine 引擎服务 默认会在宿主机创建网卡 命名
  • MVC模型图

    MVC图
  • 【联想RQ940】联想RQ940更换主板电池+重新设置BIOS

    RQ940服务器告警灯闪烁 连接管理口查看日志 判断问题为主板纽扣电池电压低 纽扣电池型号为CR2032 停业务 关机 下架 拆机 电池位于图片所示位置 可以先将左边RAID卡拆下来 方便更换电池 2 重新设置BIOS 更换电池后 由于BI
  • SpringBoot 微服务 详解

    1 注入 1 1 Bean对象管理 Spring Boot 由于没有XML文件 所以所有的Bean管理都放入在一个配置类中实现 配置类就是类上具有 Configuration的类 这个类就相当于之前的applicationContext x
  • 计算机竞赛 基于CNN实现谣言检测 - python 深度学习 机器学习

    文章目录 1 前言 1 1 背景 2 数据集 3 实现过程 4 CNN网络实现 5 模型训练部分 6 模型评估 7 预测结果 8 最后 1 前言 优质竞赛项目系列 今天要分享的是 基于CNN实现谣言检测 该项目较为新颖 适合作为竞赛课题方向
  • bilibili的评论ip属地显示未知

    现象 出于某些原因 我们在日常使用中的大部分平台都开启了IP地址显示 一般会显示当事人所在的地址 这其中就有一些奇怪的地址 在此不谈魔法 就比如我最近在刷B站的时候 就在评论区发现了一些显示 未知 的ip 而只要点进他们的主页还是会发现他们
  • 广度优先搜索(BFS)(队列实现) 走迷宫

    BFS应用 寻找最短路径或者遍历路径 树 图或者更抽象的 实现方法 队列 为什么bfs需要队列实现 队列的原理是先进先出 而广度优先搜索类似于树的层次遍历 从离根节点最近的点开始向外扩散 因此用队列将最先遍历的点存入 后遍历的点后存入 符合
  • react 父组件调用子组件的方法

    子组件中 const child forwardRef props ref gt useImperativeHandle ref gt 这里面的方法是暴露给父组件的 test console log 我是组件里的test方法 test2 t
  • druid 手动指定数据源_Springboot集成 Druid

    前言 对于数据访问层 无论是Sql还是NoSql SpringBoot默认采用整合SpringData的方式进行统一管理 添加大量的自动配置 屏蔽了很多设置 引入了各种XxxTemplate和XxxRepository来简化我们队数据访问层
  • 【JS 构造

    个人格言 时间是亳不留情的 它真使人在自己制造的镜子里照见自己的真相 Git专栏 Git篇 JavaScript专栏 js实用技巧篇 该专栏持续更新中 目的是给大家分享一些常用实用技巧 同时巩固自己的基础 共同进步 欢迎前来交流 你的一键三
  • Java POI输出excel单元格画斜线

    sheet cell画斜线 首先初始化HSSFWorkbook对象 通过此对象创建excel的一个名称为 line 的sheet 下面是通过sheet对象创建单元格 HSSFWorkbook wb new HSSFWorkbook HSSF