java 文字生成表格图片

本文介绍了如何在Java中优化文字生成表格图片的过程,重点在于单元格合并的优化,现在可以避免繁琐的for循环,同时支持标题和列宽的自定义设置。参考了一篇CSDN博客上的实现代码。
摘要由CSDN通过智能技术生成

基于参考文档,本文做了优化处理。

优化点:

1. 单元格合并,目前测试的行的单元格合并线进行了优化。不用写单个的for循环去优化,列的还未进行测试,只需要传入的数组坐标不赋值即可。

2. 标题、列宽可控,根据传入的数值。

参考文档:

java生成表格图片,使用Graphics_坠机的舒克的博客-CSDN博客_java生成表格图片实现代码package com.xjj.modules.test;import com.xjj.modules.redem.form.RedeemConfirmationModel;import com.xjj.modules.redem.util.PictureUtil;/** * @Author: wumingkai * @Description: * @Date:Create:in 2020/3/22 10:32 * @Modified By: */public class Tehttps://blog.csdn.net/qq_39474136/article/details/106583911

java 代码:



import sun.misc.BASE64Encoder;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @description
 * @date 2022/4/22
 */
public class PictureCreateByTextUtil {
    public final static PictureCreateByTextUtil pictureUtil = new PictureCreateByTextUtil();

    private PictureCreateByTextUtil() {
    }

    public static PictureCreateByTextUtil getInstance() {
        return pictureUtil;
    }

    /**
     * 通过传入的数据,进行图片生成。
     * @date 2022/4/22
     * @param
     * @return
     */
    public void createImagesByDefineData(double[] colWidthPercent, String firstTitle, String twoTitle, String[][] tableData, String filePath, String fileName) throws Exception{
        myGraphicsGenerationDefineData(colWidthPercent, firstTitle, twoTitle, tableData, filePath, fileName);
    }

    public void myGraphicsGenerationDefineData(double[] colWidthPercent, String firstTitle, String twoTitle, String cellsValue[][], String path, String fileName) throws Exception{

        // 字体大小
        int fontTitileSize = 15;
        // 横线的行数
        int totalrow = cellsValue.length + 1;
        // 竖线的行数
        int totalcol = 0;
        if (cellsValue[0] != null) {
            totalcol = cellsValue[0].length;
        }
        // 图片宽度
        int imageWidth = 1792;
        // 行高
        int rowheight = 40;
        // 图片高度
        int imageHeight = totalrow * rowheight + 200;
        // 起始高度
        int startHeight = 50;
        // 起始宽度
        int startWidth = 10;
        // 单元格宽度
        int colwidth = (int) ((imageWidth - 20) / totalcol);
        BufferedImage image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);
        Graphics graphics = image.getGraphics();
        graphics.setColor(Color.WHITE);
        graphics.fillRect(0, 0, imageWidth, imageHeight);
        graphics.setColor(new Color(220, 240, 240));

        //画横线
        for (int j = 0; j < totalrow; j++) {
            graphics.setColor(Color.black);
            graphics.drawLine(startWidth,
                    startHeight + (j + 1) * rowheight,
                    startWidth + colwidth * totalcol,
                    startHeight + (j + 1) * rowheight);
        }

        // 竖线位置坐标
        int[] colLineWidth = new int[colWidthPercent.length];
        int startWidthInt = startWidth;
        for(int i = 1; i < colWidthPercent.length + 1; i++){
            startWidthInt += (int)(imageWidth * colWidthPercent[i - 1]);
            // 防止超出
            if(startWidthInt > imageWidth){
                startWidthInt = imageWidth - startWidth;
            }
            colLineWidth[i-1] = startWidthInt;
        }

        //画竖线
        for (int k = 0; k < colWidthPercent.length; k++) {
            graphics.setColor(Color.black);
            graphics.drawLine(colLineWidth[k], startHeight + rowheight, colLineWidth[k], startHeight + rowheight * totalrow);
        }

        graphics.setColor(Color.black);

        //设置字体
        Font font = new Font("微软雅黑", Font.BOLD, fontTitileSize);
        graphics.setFont(font);

        //写标题
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String title02 = "生成时间:" + simpleDateFormat.format(new Date());
        graphics.drawString(title02, startWidth, startHeight + rowheight - 10);

        Font fonttile = new Font("微软雅黑", Font.BOLD, 18);
        graphics.setFont(fonttile);

        //写标题
        graphics.drawString(firstTitle, 850, 25);

        //写标题
        graphics.drawString(twoTitle, 790, 60);
        //写入内容
        for (int n = 0; n < cellsValue.length; n++) {
            for (int h = 0; h < cellsValue[n].length; h++) {

                if(cellsValue[n] == null || cellsValue[n][h] == null){
                    // 合并单元格(横着的部分)
                    graphics.setColor(Color.white);
                    graphics.drawLine(colLineWidth[h] + 1, startHeight + (n + 1) * rowheight, colLineWidth[h == cellsValue[n].length ? h : (h+1)] - 1, startHeight + (n + 1) * rowheight);
                    continue;
                }
                font = new Font("微软雅黑", Font.PLAIN, fontTitileSize);
                graphics.setFont(font);
                graphics.setColor(Color.BLACK);
                if (h > 0) {
                    if (!cellsValue[n][h].equals(cellsValue[n][h - 1])) {
                        graphics.drawString(cellsValue[n][h], colLineWidth[h] + 35, startHeight + rowheight * (n + 2) - 10);
                    }
                } else {
                    graphics.drawString(cellsValue[n][h], colLineWidth[h] + 35, startHeight + rowheight * (n + 2) - 10);
                }

            }
        }
        // 保存图片
        createImage(image, path, fileName);
    }

    /**
     * 将图片保存到指定位置
     *
     * @param image        缓冲文件类
     * @param fileLocation 文件位置
     */
    public static void createImage(BufferedImage image, String fileLocation, String fileName) {
        try {
            File file = new File(fileLocation);
            if (!file.exists()) {
                file.mkdir();
            }
            FileOutputStream fos = new FileOutputStream(fileLocation + fileName);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            ImageIO.write(image, "jpg", fos);
           /* JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
            encoder.encode(image);*/
            bos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 图片转换为string
     *
     * @return
     */
    public static String fileToByteArray(String filePath) throws Exception {
        BASE64Encoder encoder = new sun.misc.BASE64Encoder();
        File file = new File(filePath);
        BufferedImage bi = ImageIO.read(file);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(bi, "jpg", baos);
        byte[] bytes = baos.toByteArray();
        return encoder.encodeBuffer(bytes).trim();
    }

    public static void main(String[] args) {
        String firstTitle = "账户交易记录";
        String twoTitle = "用户编号:23523532";

        String[] tableTile = {"交易类型", "时间(yyyy-mm-dd hh:mm:ss)", "交易金额", "本金余额", "待还利息", "待还罚息", "待还利息+罚息之和"};
        double[] colWidthPercent = {0, 0.1, 0.2, 0.14, 0.14, 0.14, 0.14, 0.14};

        String[][] tableData2 = new String[4][tableTile.length];

        for(int i = 0; i < tableTile.length; i++){
            tableData2[0][i] = tableTile[i];
        }
        tableData2[1][0] = "放款";
        tableData2[2][0] = "还款";
        tableData2[3][0] = "罚息";

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        tableData2[1][1] = simpleDateFormat.format(new Date());

        tableData2[1][2] = "30";
        tableData2[2][2] = "50";
        tableData2[3][2] = "100";

        tableData2[1][3] = "1000";
        tableData2[1][4] = "200";
        tableData2[1][5] = "2";
        tableData2[1][6] = "12000";
        try {
            PictureCreateByTextUtil.getInstance().createImagesByDefineData(colWidthPercent, firstTitle, twoTitle, tableData2, "K:\\数据\\", "test.jpg");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


效果:

Java 中,将文字转换成图片并实现自动换行通常是通过使用第三方库如 `Apache Batik` 或 `iText` 来生成 PDF 文件,然后将其转换为图片,因为 PDF 具有良好的文本布局能力。如果你需要控制每行的字符数或宽度来实现换行,可以按照以下步骤操作: 1. **使用 iText**: - 首先,你需要添加 iText 库到你的项目中,可以通过 Maven 或 Gradle 依赖管理工具引入。 ```java // Maven: <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13</version> </dependency> // Gradle: implementation 'com.itextpdf:itextpdf:5.5.13' ``` 2. **创建 PDF 文档**: ```java PdfDocument pdf = new PdfDocument(); PdfPTable table = new PdfPTable(2); // 表示两列,可以根据需要调整列数 PdfPCell cell = new PdfPCell(new Phrase("这是一个例子", font)); // 创建单元格,设置字体 cell.setNewLine(true); // 设置允许换行 table.addCell(cell); // 添加更多内容... pdf.addChapter(title, table); ``` 3. **保存为图片**: 使用 iText 将 PDF 转换成图片文件(比如 PNG),例如: ```java try (OutputStream os = new FileOutputStream("output.png")) { ImageWriter writer = ImageIO.getImageWritersByFormatName("png").next(); Image img = Image.getInstance(pdf.getUnderlyingResource(PdfName.PAGE)); ImageWriteParam param = writer.getDefaultImageWriteParam(pdf.newOutputStream(os)); writer.writeImage(img, param); } catch (IOException e) { throw new RuntimeException(e); } ``` 4. **控制行宽**: 可以使用 `PdfColumnWidth` 对象来自定义表格列宽,以便根据字符长度换行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值