Java代码将Excel转成html中的table

Java代码将Excel转成html中的table

今天无意间打开了csdn,看到一篇文章,使用java代码读写Excel。感觉很有意思,最近也可能会用到,于是就模仿着练习了一下。突发奇想,就写了一个将Excel转成html中table的小工具。
使用java代码读写Excel链接

1. pom 依赖

<dependencies>
        <!-- xls 操作2003版本Excel -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>

        <!--xlsx 操作2007版本Excel -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>
    </dependencies>
    

这里是直接使用的参考文章中的依赖。

2. 工具类 ExcelToTable.java

package com.drc.util;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * 将Excel 文件转换为 html表格 table
 * toTable 方法为转换方法, 使用的都是接口,所以具体使用什么样的实现并不影响
 */
public class ExcelToTable {
    /**
     * 两种不同的工作簿,对应了Excel2003和Excel2007
     * 它们都实现了Workbook
     */
    private Workbook workbook;
    // Excel文件路径
    private String filePath;

    // 构造方法
    public ExcelToTable() {}
    // 构造方法,有参,会初始化workbook
    public ExcelToTable(String filePath) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException,
     InstantiationException, IllegalAccessException, FileNotFoundException {
        this.filePath = filePath;
        initWorkbookType();
    }

    // getter setter
    public void setWorkbook(Workbook workbook) {
        this.workbook = workbook;
    }

    public String getFilePath() {
        return filePath;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }

    public Workbook getWorkbook() {
        return workbook;
    }

    /**
     * 将excel转换成表格 table
     * @return table 的字符串
     */
    public String toTable() {
        StringBuilder table = new StringBuilder();
        table.append("<table cellspacing='0' border='1'>");
        Sheet sheet = workbook.getSheetAt(0);
        if (sheet != null) {
            Iterator<Row> rowIterator = sheet.rowIterator();

            while (rowIterator.hasNext()) {
                table.append("<tr");
                Row row = rowIterator.next();

                table.append(">");
                Iterator<Cell> cellIterator = row.cellIterator();
                // 遇到合并列时进行计数
                int colCount = 0;
                while (cellIterator.hasNext()) {
                    Cell cell = cellIterator.next();

                    // 判断是否为合并单元格
                    Map<String, Integer> map = getMergedRegionInfo(sheet, cell);

                    // 如果有合并列
                    // 如果这一列有colspan属性(是一个合并列),并且是第一次被获取到,
                    // 那么进行计数器的增加,防止第二次获取到同一个合并单元格时,进行单元格的重复添加
                    if (map.get("colspan") != null) {
                        if (colCount++ == 0) {
                            table.append("<td ");
                            table.append("colspan=" + map.get("colspan"));
                            table.append(">");
                            table.append(cell.getStringCellValue());
                            table.append("</td>");
                        }
                    } else if (map.get("rowspan") != null) {// 如果有合并行
                        // 如果这一列的当前行就是这个合并单元格的第一行,那么我们创建这个单元格,并合并对应的行数
                        int rowIndex = cell.getRowIndex();
                        if (rowIndex++ == map.get("firstR")) {
                                table.append("<td ");
                                table.append("rowspan=" + map.get("rowspan"));
                                table.append(">");
                                table.append(cell.getStringCellValue());
                                table.append("</td>");
                            }
                        } else {
                        // 如果没有合并列
                        table.append("<td>");
                        table.append(cell.getStringCellValue());
                        table.append("</td>");
                    }
                }
                table.append("</tr>");
            }
            table.append("</table>");

            return table.toString();
        }

        return null;
    }

    /**
     * 初始化workbook
     */
    private void initWorkbookType() throws ClassNotFoundException, NoSuchMethodException,
        IllegalAccessException, InvocationTargetException, InstantiationException, FileNotFoundException {
        // 根据文件类型,决定使用的工作簿的类型
        String type = "xls".equals(getSuffix().trim()) ?
                "org.apache.poi.hssf.usermodel.HSSFWorkbook" : "org.apache.poi.xssf.usermodel.XSSFWorkbook";

        // 文件输入流读取文件
        InputStream in = new FileInputStream(filePath);
        // 反射创建workbook
        Class workbookClass = Class.forName(type);
        this.workbook = (Workbook) workbookClass.getConstructor(InputStream.class).newInstance(in);
    }

    /**
     * 获取文件后缀名
     * @return
     */
    private String getSuffix() {
        int dotIndex = filePath.lastIndexOf(".");
        return filePath.substring(dotIndex + 1);
    }

    /**
     * 读取合并的单元格信息
     * @param sheet
     * @param cell
     * @return
     */
    private Map<String, Integer> getMergedRegionInfo(Sheet sheet, Cell cell) {
        int firstC;
        int lastC;
        int firstR;
        int lastR;
        Map<String, Integer> map = new HashMap<>();
        for (int cellNum = 0; cellNum < sheet.getNumMergedRegions(); cellNum++) {
            CellRangeAddress mergedRegion = sheet.getMergedRegion(cellNum);
            firstC = mergedRegion.getFirstColumn();
            lastC = mergedRegion.getLastColumn();
            firstR = mergedRegion.getFirstRow();
            lastR = mergedRegion.getLastRow();

            // 如果这个单元格在这个 合并区域的范围内,那么它就是这个单元格
            if (cell.getRowIndex() >= firstR && cell.getRowIndex() <= lastR) {
                if (cell.getColumnIndex() >= firstC && cell.getColumnIndex() <= lastC) {
                    // 合并的合数和列数,以及合并单元格的第一行索引
                    int rowspan = lastR-firstR;
                    int colspan = lastC-firstC;
                    if (rowspan > 0)
                        map.put("rowspan", rowspan+1);
                        map.put("firstR", firstR);
                    if (colspan > 0)
                        map.put("colspan", colspan+1);
                }
            }
        }
        return map;
    }
}

3. 测试类

package com.drc.test;

import com.drc.util.ExcelToTable;

import java.io.FileNotFoundException;
import java.lang.reflect.InvocationTargetException;

/**
 * 测试类
 */
public class ExcelToTableTest {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, FileNotFoundException {
        ExcelToTable toHtml = new ExcelToTable("E:/excelTest/xxxx.xlsx");
        String table = toHtml.toTable();
        System.out.println(table);
    }
}

使用方法

  • 创建该工具的对象(直接使用有参构造方法比较方便)
  • 调用toTable()方法即可获得对应的table的字符串
  • 需要查看效果,将table粘贴到html页面中即可。
要将Excel换为HTML格式,可以使用Java的Apache POI和JExcelApi这两个库。 下面是使用Apache POI将Excel换为HTML的示例代码: ```java import java.io.*; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.util.*; import org.apache.poi.ss.usermodel.*; public class ExcelToHtmlConverter { public static void main(String[] args) throws Exception { FileInputStream input = new FileInputStream(new File("input.xls")); HSSFWorkbook workbook = new HSSFWorkbook(input); HSSFSheet sheet = workbook.getSheetAt(0); HtmlFileGenerator htmlGenerator = new HtmlFileGenerator(); htmlGenerator.generateHtmlFile(sheet); workbook.close(); input.close(); } } class HtmlFileGenerator { public void generateHtmlFile(HSSFSheet sheet) throws Exception { PrintWriter writer = new PrintWriter(new FileWriter("output.html")); writer.println("<html>"); writer.println("<body>"); writer.println("<table border=\"1\">"); for (Row row : sheet) { writer.println("<tr>"); for (Cell cell : row) { writer.print("<td>"); switch (cell.getCellType()) { case Cell.CELL_TYPE_STRING: writer.print(cell.getRichStringCellValue().getString()); break; case Cell.CELL_TYPE_NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { writer.print(cell.getDateCellValue()); } else { writer.print(cell.getNumericCellValue()); } break; case Cell.CELL_TYPE_BOOLEAN: writer.print(cell.getBooleanCellValue()); break; case Cell.CELL_TYPE_FORMULA: writer.print(cell.getCellFormula()); break; default: writer.print(""); } writer.println("</td>"); } writer.println("</tr>"); } writer.println("</table>"); writer.println("</body>"); writer.println("</html>"); writer.close(); } } ``` 这个示例代码Excel文件(input.xls)换为HTML文件(output.html),并将Excel的数据以表格形式展示在HTML页面。 通过这个示例代码,你可以了解到如何使用Apache POI将Excel文件换为HTML文件。如果要使用JExcelApi来实现这个功能,可以参考JExcelApi的官方文档。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值