首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JXL 庫實戰:Java 讀寫 Excel 完整教程(含 Web 導出範例)

     編輯:Java 綜合教學

JXL 庫實戰:Java 讀寫 Excel 完整教程(含 Web 導出範例)

JXL (Java Excel API) 是輕量級的 Excel 操作庫,雖然僅支援舊版 .xls 格式,但在維護舊系統、簡單報表導出場景仍具價值。本文提供完整的 Java 專案與 Web 專案雙重實戰代碼,涵蓋讀取、寫入、樣式設定、合併儲存格等核心功能。

一、Java 獨立專案:讀寫 Excel 核心代碼

package servlet;

import jxl.*;
import jxl.write.*;
import jxl.format.*;
import java.io.*;
import java.util.*;

public class Excel {
    // 寫入 Excel
    public static void writeExcel() throws Exception {
        String[] title = {"編號", "產品名稱", "產品價格", "產品數量", "生產日期", "產地", "是否出口"};
        String filePath = "e:\\testJXL.xls";
        
        WritableWorkbook wwb = Workbook.createWorkbook(new FileOutputStream(filePath));
        WritableSheet sheet = wwb.createSheet("產品清單", 0);
        
        // 寫入表頭(帶樣式)
        for (int i = 0; i < title.length; i++) {
            sheet.addCell(new Label(i, 0, title[i], getHeader()));
        }
        
        // 寫入資料行(示範多種資料類型)
        sheet.addCell(new jxl.write.Number(0, 1, 20071001));           // 數字
        sheet.addCell(new Label(1, 1, "金鴿瓜子"));                   // 字串
        sheet.addCell(new jxl.write.Number(2, 1, 200000.45, priceFormat())); // 金額格式
        sheet.addCell(new jxl.write.Number(3, 1, 200));               // 數量
        sheet.addCell(new Label(4, 1, new SimpleDateFormat("yyyy-MM-dd").format(new Date()))); // 日期
        sheet.addCell(new Label(5, 1, "陝西西安"));                   // 字串
        sheet.addCell(new jxl.write.Boolean(6, 1, true));             // 布林值
        
        // 合併儲存格
        sheet.mergeCells(0, 3, 2, 3);
        sheet.addCell(new Label(0, 3, "合併了三個儲存格"));
        
        // 自定義字體
        WritableFont font = new WritableFont(WritableFont.createFont("隸書"), 20);
        sheet.addCell(new Label(2, 6, "隸書", new WritableCellFormat(font)));
        
        wwb.write();
        wwb.close();
    }
    
    // 讀取 Excel
    public static void readExcel() throws Exception {
        Workbook rwb = Workbook.getWorkbook(new FileInputStream("d:\\testJXL.xls"));
        Sheet sheet = rwb.getSheet(0);
        List data = new ArrayList<>();
        
        for (int i = 0; i < sheet.getRows(); i++) {
            String[] row = new String[sheet.getColumns()];
            for (int j = 0; j < sheet.getColumns(); j++) {
                row[j] = sheet.getCell(j, i).getContents();
            }
            data.add(row);
        }
        // 處理資料...
        rwb.close();
    }
    
    // 表頭樣式:藍字、黃底、黑框、置中
    private static WritableCellFormat getHeader() throws WriteException {
        WritableFont font = new WritableFont(WritableFont.TIMES, 10, WritableFont.BOLD);
        font.setColour(Colour.BLUE);
        WritableCellFormat format = new WritableCellFormat(font);
        format.setAlignment(Alignment.CENTRE);
        format.setVerticalAlignment(VerticalAlignment.CENTRE);
        format.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);
        format.setBackground(Colour.YELLOW);
        return format;
    }
    
    // 價格格式:千分位、兩位小數
    private static WritableCellFormat priceFormat() throws WriteException {
        NumberFormat nf = new NumberFormat("#,###.00");
        return new WritableCellFormat(nf);
    }
}

JXL 導出結果示意圖

二、Web 專案:Servlet 導出 Excel 完整流程

2.1 專案依賴

引入 jxl-2.6.jar 與 servlet-api.jar。

2.2 實體類 Member.java

package entity;
import java.util.Date;
import java.io.Serializable;

public class Member implements Serializable {
    private String id, checkOrg, sn, memberName, sex, cardId;
    private String duty, title, academic, special, workTime, memo, role;
    private Date lastModify, regTime;
    // 建構子、Getter/Setter 略...
}

2.3 導出 Servlet:ExportExlServlet.java

package servlet;

import entity.Member;
import jxl.*;
import jxl.write.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class ExportExlServlet extends HttpServlet {
    protected void service(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        String orgName = "XX單位";
        List list = fetchFromDB(); // 實際從資料庫查詢
        exportExcel(resp, list, orgName + "人員明細表");
    }
    
    private void exportExcel(HttpServletResponse resp, List list, String fileName) 
            throws IOException, WriteException {
        resp.setContentType("application/ms-excel");
        resp.addHeader("Content-Disposition", "attachment;filename=" 
            + new String(fileName.getBytes(), "iso8859-1") + ".xls");
        
        WritableWorkbook wwb = Workbook.createWorkbook(resp.getOutputStream());
        WritableSheet sheet = wwb.createSheet("人員明細", 0);
        
        // 表頭
        String[] titles = {"編號", "姓名", "性別", "身份證號", "學歷", "專業", "職稱", "職務", "角色", "備註"};
        for (int i = 0; i < titles.length; i++) {
            sheet.addCell(new Label(i, 0, titles[i], Excel.getHeader()));
        }
        
        // 資料行
        WritableCellFormat dataFormat = createDataFormat();
        WritableFont font = new WritableFont(WritableFont.createFont("隸書"), 20);
        WritableCellFormat specialFormat = new WritableCellFormat(font);
        
        int row = 1;
        for (Member m : list) {
            sheet.addCell(new Label(0, row, String.valueOf(row), dataFormat));
            sheet.addCell(new Label(1, row, m.getMemberName(), dataFormat));
            sheet.addCell(new Label(2, row, m.getSex(), dataFormat));
            sheet.addCell(new Label(3, row, m.getCardId(), dataFormat));
            sheet.addCell(new Label(4, row, m.getAcademic(), dataFormat));
            sheet.addCell(new Label(5, row, m.getSpecial(), dataFormat));
            sheet.addCell(new Label(6, row, m.getTitle(), dataFormat));
            sheet.addCell(new Label(7, row, m.getDuty(), dataFormat));
            sheet.addCell(new Label(8, row, m.getRole(), dataFormat));
            sheet.addCell(new Label(9, row, m.getMemo(), specialFormat)); // 最後一欄特殊字體
            row++;
        }
        
        wwb.write();
        wwb.close();
    }
    
    private WritableCellFormat createDataFormat() throws WriteException {
        WritableFont wf = new WritableFont(WritableFont.ARIAL, 13);
        WritableCellFormat wcf = new WritableCellFormat(wf);
        wcf.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);
        wcf.setVerticalAlignment(VerticalAlignment.CENTRE);
        return wcf;
    }
    
    private List fetchFromDB() {
        // 模擬資料,實際替換為 DAO 查詢
        List list = new ArrayList<>();
        Member m = new Member();
        m.setMemberName("張三"); m.setSex("男"); m.setCardId("123456");
        m.setAcademic("碩士"); m.setSpecial("計算機"); m.setTitle("工程師");
        m.setDuty("開發"); m.setRole("Admin"); m.setMemo("備註");
        list.add(m); list.add(m); list.add(m);
        return list;
    }
}

2.4 web.xml 註冊 Servlet

<servlet>
    <servlet-name>ExportExlServlet</servlet-name>
    <servlet-class>servlet.ExportExlServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ExportExlServlet</servlet-name>
    <url-pattern>/ExportExlServlet</url-pattern>
</servlet-mapping>

2.5 前端觸發:index.jsp

<body>
    <a href="ExportExlServlet">導出人員明細 Excel</a>
</body>

Web 導出結果1 Web 導出結果2

三、原始碼下載

完整專案原始碼託管於 GitHub:https://github.com/ablejava/Jxl-Excel

注意:JXL 專案已停止維護,不支援 .xlsx 格式。新專案建議使用 Apache POI (支援 .xls/.xlsx) 或 EasyExcel (阿里巴巴開源、記憶體效率高)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved