本章节介绍一下,在XLSX格式的Excel中画斜线的方法。

1、初始化XSSFWorkbook对象

初始化XSSFWorkbook对象,创建两行两列单元格,分别设置行高和列宽以及单元格的边框。

/**

* @Author 通靈鹿小六

* @Description 模拟测试使用的XSSFWorkbook对象

* @Date 2021-01-27 17:23

* @return org.apache.poi.xssf.usermodel.XSSFWorkbook

**/

private XSSFWorkbook getTestXSSFWorkbook() {

XSSFWorkbook wb = new XSSFWorkbook();

XSSFSheet sheet = wb.createSheet("line");

XSSFRow row0 = sheet.createRow(0);

row0.setHeightInPoints(100);

XSSFRow row1 = sheet.createRow(1);

row1.setHeightInPoints(70);

XSSFCellStyle cellStyle = getCellFormat(wb);

sheet.setColumnWidth(0, 80 * 90);

sheet.setColumnWidth(1, 60 * 90);

XSSFCell cell0_0 = row0.createCell(0);

XSSFCell cell0_1 = row0.createCell(1);

XSSFCell cell1_0 = row1.createCell(0);

XSSFCell cell1_1 = row1.createCell(1);

cell0_0.setCellStyle(cellStyle);

cell0_1.setCellStyle(cellStyle);

cell1_0.setCellStyle(cellStyle);

cell1_1.setCellStyle(cellStyle);

return wb;

}

private XSSFCellStyle getCellFormat(XSSFWorkbook wb) {

XSSFCellStyle cellStyle = wb.createCellStyle();

if (cellStyle.getBorderBottom() != BorderStyle.THIN) {

cellStyle.setBorderBottom(BorderStyle.THIN);

}

if (cellStyle.getBorderLeft() != BorderStyle.THIN) {

cellStyle.setBorderLeft(BorderStyle.THIN);

}

if (cellStyle.getBorderTop() != BorderStyle.THIN) {

cellStyle.setBorderTop(BorderStyle.THIN);

}

if (cellStyle.getBorderRight() != BorderStyle.THIN) {

cellStyle.setBorderRight(BorderStyle.THIN);

}

cellStyle.setBottomBorderColor((short) 0);

cellStyle.setLeftBorderColor((short) 0);

cellStyle.setRightBorderColor((short) 0);

cellStyle.setTopBorderColor((short) 0);

cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);

XSSFFont xssfFont = wb.createFont();

xssfFont.setFontName("Arial");

cellStyle.setFont(xssfFont);

return cellStyle;

}

2、在Cell中画斜线

注意:在XLSX格式的单元格中画线的时候,是不支持从下往上画的。换个说法,斜线的终止点坐标X必须大于等于起始点坐标X,终止点坐标Y必须大于等于起始点坐标Y。如下图所示两种情况,是需要特殊处理的。:

/**

* @Author 通靈鹿小六

* @Description 在XLSX文件中画斜线

* @Date 2021-01-27 16:34

* @param sheet XSSFSheet格式对象

* @param rowIndex 斜线表头单元格行索引

* @param colIndex 斜线表头单元格列索引

* @param slashType 斜线类型

* @param slpList 斜线表头线集合

**/

private static void drawLineXlsx(XSSFSheet sheet, int rowIndex, int colIndex, String slashType, ArrayList slpList) {

XSSFDrawing xssfDrawing = sheet.createDrawingPatriarch();

for (SlashLinePosition slp : slpList) {

XSSFClientAnchor xssfClientAnchor = new XSSFClientAnchor(

slp.getStartX(), slp.getStartY(), slp.getEndX(), slp.getEndY(),

colIndex, rowIndex, colIndex, rowIndex);

XSSFSimpleShape shape = xssfDrawing.createSimpleShape(xssfClientAnchor);

if (slashType == "LEFT_TOP" || slashType == "RIGHT_BOTTOM") {

//斜线类型为左上,右下的时候,使用斜线

shape.setShapeType(ShapeTypes.LINE);

} else {

//斜线类型为左下,右上的时候,使用反斜线

shape.setShapeType(ShapeTypes.LINE_INV);

}

// 设置线宽

shape.setLineWidth(0.5);

// 设置线的风格

shape.setLineStyle(0);

// 设置线的颜色

shape.setLineStyleColor(0, 0, 0);

}

}

如果我们想画如下一条斜线:

图1

上面说了,不能从下往上画线。所以要使用反斜线。而在使用反斜线的同时,线条的坐标也要发生变化。

最终定义如图2所示的坐标,同时设置线条为反斜线,最终生成的单元格效果和图1一样。

图2

3、计算线的坐标

结合第二点中介绍的内容,当斜线类型为LEFT_BOTTOM和RIGHT_TOP的时候,计算线的起止坐标也会有不一样。最终代码如下:

/**

* @Author 通靈鹿小六

* @Description 获取斜线表头斜线开始结束位置坐标对象集合

* @Date 2021-01-27 8:39

* @param slashType 斜线类型 LEFT_TOP左上角为起点 LEFT_BOTTOM左下角为起点 RIGHT_TOP右上角为起点 RIGHT_BOTTOM右下角为起点

* @param slashCount 斜线数量

* @param xssfSheet XLSX格式sheet对象

* @param rowIndex 斜线表头单元格行索引

* @param colIndex 斜线表头单元格列索引

* @return java.util.ArrayList 位置坐标对象集合

**/

private static ArrayList getSlashLinePositionXlsx(String slashType, int slashCount, XSSFSheet xssfSheet, int rowIndex, int colIndex) {

ArrayList slpList = new ArrayList<>();

int width = xssfSheet.getColumnWidth(colIndex) * 300;

int height = xssfSheet.getRow(rowIndex).getHeight() * 700;

switch (slashType) {

case "LEFT_TOP":

if (slashCount == 2) {

//表示只有一条斜线

SlashLinePosition slp = new SlashLinePosition(0, 0, width, height);

slpList.add(slp);

} else if (slashCount == 3) {

//表示有两条斜线

SlashLinePosition slp1 = new SlashLinePosition(0, 0, width / 2, height);

slpList.add(slp1);

SlashLinePosition slp2 = new SlashLinePosition(0, 0, width, height / 2);

slpList.add(slp2);

}

break;

case "LEFT_BOTTOM":

if (slashCount == 2) {

//表示只有一条斜线

SlashLinePosition slp = new SlashLinePosition(0, 0, width, height);

slpList.add(slp);

} else if (slashCount == 3) {

//表示有两条斜线

SlashLinePosition slp1 = new SlashLinePosition(0, 0, width / 2, height);

slpList.add(slp1);

SlashLinePosition slp2 = new SlashLinePosition(0, height / 2, width, height);

slpList.add(slp2);

}

break;

case "RIGHT_TOP":

if (slashCount == 2) {

//表示只有一条斜线

SlashLinePosition slp = new SlashLinePosition(0, 0, width, height);

slpList.add(slp);

} else if (slashCount == 3) {

//表示有两条斜线

SlashLinePosition slp1 = new SlashLinePosition(0, 0, width, height / 2);

slpList.add(slp1);

SlashLinePosition slp2 = new SlashLinePosition(width / 2, 0, width, height);

slpList.add(slp2);

}

break;

case "RIGHT_BOTTOM":

if (slashCount == 2) {

//表示只有一条斜线

SlashLinePosition slp = new SlashLinePosition(0, 0, width, height);

slpList.add(slp);

} else if (slashCount == 3) {

//表示有两条斜线

SlashLinePosition slp1 = new SlashLinePosition(0, height / 2, width, height);

slpList.add(slp1);

SlashLinePosition slp2 = new SlashLinePosition(width / 2, 0, width, height);

slpList.add(slp2);

}

break;

default:

break;

}

return slpList;

}

代码中,定义width和heigth的时候,分别乘以了不同的系数。系数是我测试出来的,但是没有弄清楚为何这样子,如果有明白的人可以告诉我一下。

int width = xssfSheet.getColumnWidth(colIndex) * 300;

int height = xssfSheet.getRow(rowIndex).getHeight() * 700;

最终生成的效果如下图所示:

如果本文对您有了启发作用,请动动小手,麻烦点个赞~~

python表格绘制斜线表头_Java中使用POI在Excel单元格中画斜线—XLSX格式相关推荐

  1. java中使用poi读取excel单元格日期值

    近期在项目中做导入的时候,遇到读取cexcel表格数据时读取到的是string类型的数字,为我们需要存的是正确的日期格式. private String setDate(String ben){ Si ...

  2. java 使用poi导出excel单元格中的内容自动换行

    HSSFCellStyle cellStyle = wb.createCellStyle();cellStyle.setWrapText(true); //文本内容自动换行

  3. matlab中图显示单元格,excel如何根据表格中的数据自动在单元格中画图:

    如何利用matlab根据excel表格里面的数据画图 将待的结构的数据录入Excel中,录入意行列要跟原矩阵一一对应 录入完以后保存数据,为了后续使用方便,命名时我们最好把它命名为我们接下来在MATL ...

  4. 单元格等于计算机日期,《excel表格怎样自动填写日期》 Excel单元格中自动获取当前日期与时间...

    在excel里如何在单元格内用快捷键使之显示当前日期或时间 Ctrl : 当前日期Ctrl Shift : 当前时间 EXCEL表格中只显示日期不要显示时间 右击"单元格格式"设置 ...

  5. java字体美化_Java 在Excel单元格中应用一种/多种字体样式(实例代码)

    这篇文章主要介绍了Java 在Excel单元格中应用一种/多种字体样式,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 在Excel表格中,设置单元格字体样式时,可 ...

  6. JAVA导出excel表格标题加粗,【excle特定文字加粗】java如何设置excel单元格中部分文字加粗 例如:标题(加粗): 内容(不加粗)...

    java如何设置excel单元格中部分文字加粗 例如:标题(加粗): 内容(不加粗) HSSFCellStyle style = (HSSFCellStyle) wb.createCellStyle( ...

  7. java excel 字体_Java 在Excel单元格中应用一种/多种字体样式(实例代码)

    在Excel表格中,设置单元格字体样式时,可以对单元格内的所有字符应用同一样式,即获取指定单元,应用样式即可:另外也可以对单元格内的不同字符内容应用不同字体样式,即获取单元格中的字符位置,应用样式:本 ...

  8. Python在Excel单元格中写入公式

    场景:需要按照固定格式提取数据库中数据到excel中,因统计的内容过多,为减少数据库统计动作,对于需要二次加工的数据在Excel单元格中使用公式完成计算: 分析:从数据库提取数据,使用常规方法写入公式 ...

  9. java 向word中添加excel附件并向excel单元格中加入图片并压缩图片并根据图片动态控制单元格高度宽度

    word中加入excel附件 excel单元格中插入图片 word freemarker Excel poi 制作, jxl 插入图片 压缩图片/宽高,动态控制单元格高度与宽度 1.word 需要模板 ...

  10. html合并单元格怎么把字竖着,电脑excel单元格中文字如何在合并单元格后竖排显示...

    电脑excel单元格中文字如何在合并单元格后竖排显示 excel软件是我们现在经常使用的数据处理工具之一,接下来小编就教大家怎样在软件中设置合并单元格之后竖排显示文字. 具体如下: 1. 首先我们需要 ...

最新文章

  1. 《Arduino开发实战指南:机器人卷》一3.3 直流电机驱动电路原理
  2. 贪婪算法、递归计算、动态规划背包问题
  3. windows系统c++多线程开发
  4. 扁平化c语言教程,中国象棋人机博弈程序(扁平化棋局) C语言实现
  5. 类火墙的iptables
  6. (转) 三袋米的故事
  7. 保障电邮EMAIL通讯的安全性
  8. 使用QueenSono从ICMP提取数据
  9. HDU 4731 Minimum palindrome 打表找规律
  10. 一个被忽视的强大搜图技能——以图搜图
  11. mini计算机结构,简单拆机看内部构造_苹果 Mac mini MGEN2CH/A_台式电脑评测-中关村在线...
  12. 我的世界 Unity3D MineCraft 用Unity3D制作类似MineCraft我的世界的游戏 正经梳理一下开发01
  13. 书单 | 振聋发聩,撼世经典!总有那么一些书经得住时间的考验
  14. Android 2020年最新保活方案 保活90% 已适配8.0 ,9.0, 10.0(酷狗音乐)
  15. feign+hystrix相关超时时间配置问题
  16. 大班音乐机器人反思_大班音乐活动lbrack;机器人rsqb;
  17. failed to open file mysql,导入mysql数据库打不开的解决办法
  18. java计算机毕业设计体育用品购物系统源程序+mysql+系统+lw文档+远程调试
  19. 第一代程序员作家--王小波
  20. 基于stm32的秒表计时器设计系统Proteus仿真(源码+仿真+全套资料)

热门文章

  1. Telink BLE SIG Mesh GATT 配网功能
  2. python计算无穷级数求和_[探求无穷级数求和的几种常用方法]无穷级数求和常用公式...
  3. 微信商户批量转账到零钱
  4. mx记录什么意思?域名mx记录怎么设置?
  5. STM32计数器/定时器之PWM脉宽捕获+超声波传感器测距
  6. BUUCTF REAL
  7. CTF入门之php文件包含
  8. 034-OpenCV HSV颜色识别图片
  9. lpush和rpush的区别_Redis系列(七):数据结构List双向链表中LPUSH、LPOP、RPUSH、RPOP、LLEN命令...
  10. 101名女职工血清总胆固醇测量结果spss描述统计分析