JAVA Easyexcel导出复选框

第一步:添加依赖

		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>ooxml-schemas</artifactId>
			<version>1.4</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>easyexcel</artifactId>
			<version>3.3.4</version>
		</dependency>

第二步:示例代码

public class CreateExcelCheckbox {

    public static void main(String[] args) throws Exception {
        XSSFWorkbook workbook  = new XSSFWorkbook();
        workbook.getCTWorkbook().addNewFileVersion().setAppName("xl");
        workbook.getCTWorkbook().getFileVersion().setLastEdited("4");
        workbook.getCTWorkbook().getFileVersion().setLowestEdited("0");
        workbook.getCTWorkbook().getFileVersion().setRupBuild("4507");

        XSSFSheet sheet = workbook.createSheet();
        XSSFVMLDrawing vmlDrawing = getVMLDrawing(sheet);

        addCheckboxShapetype(vmlDrawing);

        addCheckbox(vmlDrawing, 0, 30, 0, 0, 1, 0, 1, 0, "", true);

        FileOutputStream out = new FileOutputStream("D:\\Excel.xlsx");
        workbook.write(out);
        out.close();
        workbook.close();
    }

    private static XSSFVMLDrawing getVMLDrawing(XSSFSheet sheet) {
        XSSFVMLDrawing drawing = null;
        if (sheet.getCTWorksheet().getLegacyDrawing() != null) {
            String legacyDrawingId = sheet.getCTWorksheet().getLegacyDrawing().getId();
            drawing = (XSSFVMLDrawing)sheet.getRelationById(legacyDrawingId);
        }else {
            int drawingNumber = sheet.getPackagePart().getPackage().getPartsByContentType(XSSFRelation.VML_DRAWINGS.getContentType()).size() + 1;
            POIXMLDocumentPart.RelationPart rp = sheet.createRelationship(XSSFRelation.VML_DRAWINGS, XSSFFactory.getInstance(), drawingNumber, false);
            drawing = rp.getDocumentPart();
            String rId = rp.getRelationship().getId();
            sheet.getCTWorksheet().addNewLegacyDrawing().setId(rId);
        }
        return drawing;
    }

    private static void addCheckboxShapetype(XSSFVMLDrawing drawing) throws Exception {
        String shapeTypeId = "_x0000_t201";
        CTShapetype shapetype = CTShapetype.Factory.newInstance();
        shapetype.setId(shapeTypeId);
        shapetype.setCoordsize("21600,21600");
        shapetype.setSpt(201);
        shapetype.setPath2("m,l,21600r21600,l21600,xe");

        Field _items = XSSFVMLDrawing.class.getDeclaredField("_items");
        _items.setAccessible(true);

        @SuppressWarnings("unchecked") //we know the problem and expect runtime error if it possibly occurs
        List<XmlObject> items = (List<XmlObject>)_items.get(drawing);

        Field _qnames = XSSFVMLDrawing.class.getDeclaredField("_qnames");
        _qnames.setAccessible(true);

        @SuppressWarnings("unchecked") //we know the problem and expect runtime error if it possibly occurs
        List<QName> qnames = (List<QName>)_qnames.get(drawing);

        items.add(shapetype);
        qnames.add(new QName("urn:schemas-microsoft-com:vml", "shapetype"));
    }

    private static void addCheckbox(XSSFVMLDrawing drawing,
                                    int col1, int dx1, int row1, int dy1, int col2, int dx2, int row2, int dy2,
                                    String label, boolean checked) throws Exception {
        String shapeTypeId = "_x0000_t201";

        Field _shapeId = XSSFVMLDrawing.class.getDeclaredField("_shapeId");
        _shapeId.setAccessible(true);
        int shapeId = (int)_shapeId.get(drawing);
        _shapeId.set(drawing, shapeId + 1);

        CTShape shape = CTShape.Factory.newInstance();
        shape.setId("_x0000_s" + shapeId);
        shape.setType("#" + shapeTypeId);
        shape.setFilled(com.microsoft.schemas.vml.STTrueFalse.F);
        shape.setStroked(com.microsoft.schemas.vml.STTrueFalse.F);
        String textboxHTML = "<div style='text-align:left'>"
                            +"<font face=\"Tahoma\" size=\"160\" color=\"auto\">" + label + "</font> </div>";

        CTTextbox[] textboxArray = new CTTextbox[1];
        textboxArray[0] = CTTextbox.Factory.parse(textboxHTML);
        textboxArray[0].setStyle("mso-direction-alt:auto");
        textboxArray[0].setSingleclick(com.microsoft.schemas.office.office.STTrueFalse.F);
        shape.setTextboxArray(textboxArray);

        CTClientData cldata = shape.addNewClientData();
        cldata.setObjectType(com.microsoft.schemas.office.excel.STObjectType.CHECKBOX);
        cldata.addNewMoveWithCells();
        cldata.addNewSizeWithCells();
        cldata.addNewAnchor().setStringValue("" + col1 + ", " + dx1 + ", " + row1 + ", " +dy1 + ", " + col2 + ", " + dx2 + ", " + row2 + ", " + dy2);
        cldata.addAutoFill(com.microsoft.schemas.office.excel.STTrueFalseBlank.FALSE);
        cldata.addAutoLine(com.microsoft.schemas.office.excel.STTrueFalseBlank.FALSE);
        cldata.addTextVAlign("Center");
        cldata.addNoThreeD(com.microsoft.schemas.office.excel.STTrueFalseBlank.TRUE);
        cldata.addChecked((checked)?java.math.BigInteger.valueOf(1):java.math.BigInteger.valueOf(0));

        Field _items = XSSFVMLDrawing.class.getDeclaredField("_items");
        _items.setAccessible(true);

        @SuppressWarnings("unchecked") //we know the problem and expect runtime error if it possibly occurs
        List<XmlObject> items = (List<XmlObject>)_items.get(drawing);

        Field _qnames = XSSFVMLDrawing.class.getDeclaredField("_qnames");
        _qnames.setAccessible(true);

        @SuppressWarnings("unchecked") //we know the problem and expect runtime error if it possibly occurs
        List<QName> qnames = (List<QName>)_qnames.get(drawing);

        items.add(shape);
        qnames.add(new QName("urn:schemas-microsoft-com:vml", "shape"));
    }
}

第三步:运行Main方法

导出Excel,效果如下
在这里插入图片描述

第四步:关键代码说明

addCheckbox(XSSFVMLDrawing drawing,int col1, int dx1, int row1, int dy1, int col2, int dx2, int row2, int dy2,String label, boolean checked)
col1,row1   表示左上角的单元格的坐标
dx1,dy1    表示左上角的单元格的偏移量
col2,row2   表示右下角的单元格的坐标
dx2,dy2    表示右下角的单元格的偏移量
label      单元格里的描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过使用 Apache POI 库来输出 Excel 文件,并在单元格中插入复选框。 以下是一个示例代码,它创建一个具有两个工作表的 Excel 文件。第一个工作表包含一个带有复选框的表格,第二个工作表包含一些简单的文本数据: ```java import java.io.FileOutputStream; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.*; public class ExcelWriterExample { public static void main(String[] args) throws Exception { // 创建一个工作簿 XSSFWorkbook workbook = new XSSFWorkbook(); // 创建第一个工作表 XSSFSheet sheet1 = workbook.createSheet("Sheet1"); // 创建第一行,并在其中添加标题 XSSFRow row1 = sheet1.createRow(0); XSSFCell cell1 = row1.createCell(0); cell1.setCellValue("选项"); // 在第二行中添加一个带有复选框的单元格 XSSFRow row2 = sheet1.createRow(1); XSSFCell cell2 = row2.createCell(0); cell2.setCellValue("选项1"); cell2.setCellType(CellType.BOOLEAN); cell2.setCellValue(true); // 在第三行中添加另一个带有复选框的单元格 XSSFRow row3 = sheet1.createRow(2); XSSFCell cell3 = row3.createCell(0); cell3.setCellValue("选项2"); cell3.setCellType(CellType.BOOLEAN); cell3.setCellValue(false); // 创建第二个工作表 XSSFSheet sheet2 = workbook.createSheet("Sheet2"); // 在第一行中添加一些文本数据 XSSFRow row4 = sheet2.createRow(0); XSSFCell cell4 = row4.createCell(0); cell4.setCellValue("Hello, World!"); // 将工作簿保存到文件 FileOutputStream fileOut = new FileOutputStream("output.xlsx"); workbook.write(fileOut); fileOut.close(); // 关闭工作簿 workbook.close(); } } ``` 在上面的代码中,我们使用 `setCellType()` 方法将单元格的类型设置为 `CellType.BOOLEAN`,然后使用 `setCellValue()` 方法将复选框的值设置为 `true` 或 `false`。当 Excel 文件打开时,这些单元格将以复选框的形式显示。 希望这可以帮助你解决你的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值