使用JXL读取Excel表格,拷贝、更新Excel工作薄

 

 

package cn.com.yitong.xls;

 

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

import java.util.Vector;

 

import cn.com.yitong.ChartImg;

import cn.com.yitong.VireObj;

import cn.com.yitong.platform.log.YTLogger;

 

import jxl.CellType;

import jxl.Workbook;

import jxl.format.CellFormat;

import jxl.format.Colour;

import jxl.format.UnderlineStyle;

import jxl.write.Formula;

import jxl.write.Label;

import jxl.write.Number;

import jxl.write.WritableCell;

import jxl.write.WritableCellFormat;

import jxl.write.WritableFont;

import jxl.write.WritableImage;

import jxl.write.WritableSheet;

import jxl.write.WritableWorkbook;

import jxl.write.WriteException;

import jxl.write.biff.RowsExceededException;

 

public class XLSDemo

{

    private static final int TITLE_LENGTH = 7;

    private static final int SHEET_WIDTH = 32;

    private static final int SHEET_HEIGHT = 116;

   

    /**

     * 创建Excel

     */

    private void makeXls()

    {

        Workbook workbook = null;

        try

        {

            // 构建Workbook对象, 只读Workbook对象

            // 直接从本地文件创建Workbook, 从输入流创建Workbook

            InputStream ins = new FileInputStream("D:/Workspace/testproj/source.xls");

            workbook = Workbook.getWorkbook(ins);

 

            // 利用已经创建的Excel工作薄创建新的可写入的Excel工作薄

            File outFile = new File("D:/Workspace/testproj/test.xls");

            WritableWorkbook wwb = Workbook.createWorkbook(outFile, workbook);

            // 读取第一张工作表

            WritableSheet dataSheet = wwb.getSheet(0);

            //  设置冻结单元格

            dataSheet.getSettings().setVerticalFreeze(7);

            dataSheet.getSettings().setHorizontalFreeze(2);

           

            // 测试模拟数据

            Vector vecData = new Vector();

            for(int i = 0; i < 50; i ++)

            {

                VireObj obj = new VireObj();

                obj.setOrgNo("00" + i + "0");

                obj.setOrgName("机构" + (i + 1));

                obj.setOpenAcc((int)(100 * Math.random()));

                obj.setDestoryAcc((int)(10 * Math.random()));

                obj.setTotalAcc((int)(500 * Math.random()));

                obj.setMonthInCount((int)(500 * Math.random()));

                obj.setMonthInMoney(500 * Math.random());

                obj.setMonthOutCount((int)(500 * Math.random()));

                obj.setMonthOutMoney(500 * Math.random());

               

                vecData.add(obj);

            }           

            // 插入数据

            insertData(wwb, dataSheet, vecData);           

            // 插入模拟图像数据

            Vector vecImg = new Vector();

            for(int i = 0; i < 3; i ++)

            {

                ChartImg img = new ChartImg();

                img.setImgTitle("图像" + (i + 1));

                img.setImgName("D:/Workspace/testproj/images/barchart.png");

                vecImg.add(img);

            }

            // 插入图表

            insertImgsheet(wwb, vecImg);

            //写入Excel对象

            wwb.write();

            wwb.close();

        } catch (Exception e)

        {

            YTLogger.logDebug(e);

        } finally

        {

            // 操作完成时,关闭对象,释放占用的内存空间

            workbook.close();

        }

    }

   

    /**

     * 插入数据

     * @param wwb WritableWorkbook : 工作簿

     * @param dataSheet WritableSheet : 工作表

     * @throws RowsExceededException

     * @throws WriteException

     */

    private void insertData(WritableWorkbook wwb, WritableSheet dataSheet, Vector vecData) throws RowsExceededException, WriteException

    {

        // 获得标题单元格对象       

        modiStrCell(dataSheet, 2, 0, "工商银行江苏省分行 个人网上银行业务种类/开销户明细报表(2005-12)", null);

        // 修改数据单元格数据

        for(int i = 0; i < vecData.size(); i ++)

        {

            VireObj obj = (VireObj)vecData.get(i);

            modiStrCell(dataSheet, 0, TITLE_LENGTH + i, obj.getOrgNo(), null);

            modiStrCell(dataSheet, 1, TITLE_LENGTH + i, obj.getOrgName(), null);

            modiNumCell(dataSheet, 2, TITLE_LENGTH + i, obj.getOpenAcc(), null);

            modiNumCell(dataSheet, 3, TITLE_LENGTH + i, obj.getDestoryAcc(), null);

            modiNumCell(dataSheet, 4, TITLE_LENGTH + i, obj.getTotalAcc(), null);

            modiNumCell(dataSheet, 5, TITLE_LENGTH + i, obj.getMonthInCount(), null);

            modiNumCell(dataSheet, 6, TITLE_LENGTH + i, obj.getTotalInMoney(), null);

            modiNumCell(dataSheet, 7, TITLE_LENGTH + i, obj.getMonthOutCount(), null);

            modiNumCell(dataSheet, 8, TITLE_LENGTH + i, obj.getMonthOutMoney(), null);

        }   

        // 删除空行

        for (int j = vecData.size() + TITLE_LENGTH; j < SHEET_HEIGHT; j++)

        {

            dataSheet.removeRow(vecData.size() + TITLE_LENGTH);

        }       

        // 插入公式

        for(int i = 2; i < SHEET_WIDTH; i ++)

        {

            modiFormulaCell(dataSheet, i, vecData.size() + TITLE_LENGTH, 8, vecData.size() + TITLE_LENGTH, null);

        }       

    }

 

    /**

     * 修改字符单元格的值

     * @param dataSheet WritableSheet : 工作表

     * @param col int : 列

     * @param row int : 行

     * @param str String : 字符

     * @param format CellFormat : 单元格的样式

     * @throws RowsExceededException

     * @throws WriteException

     */

    private void modiStrCell(WritableSheet dataSheet, int col, int row, String str, CellFormat format) throws RowsExceededException, WriteException

    {

        // 获得单元格对象

        WritableCell cell = dataSheet.getWritableCell(col, row);

        // 判断单元格的类型, 做出相应的转化

        if (cell.getType() == CellType.EMPTY)

        {

            Label lbl = new Label(col, row, str);

            if(null != format)

            {

                lbl.setCellFormat(format);

            } else

            {

                lbl.setCellFormat(cell.getCellFormat());

            }

            dataSheet.addCell(lbl);

        } else if (cell.getType() == CellType.LABEL)

        {

            Label lbl = (Label)cell;

            lbl.setString(str);

        } else if (cell.getType() == CellType.NUMBER)

        {

            // 数字单元格修改

            Number n1 = (Number)cell;

            n1.setValue(42.05);

        }

    }

   

    /**

     * 修改数字单元格的值

     * @param dataSheet WritableSheet : 工作表

     * @param col int : 列

     * @param row int : 行

     * @param num double : 数值

     * @param format CellFormat : 单元格的样式

     * @throws RowsExceededException

     * @throws WriteException

     */

    private void modiNumCell(WritableSheet dataSheet, int col, int row, double num, CellFormat format) throws RowsExceededException, WriteException

    {

        // 获得单元格对象

        WritableCell cell = dataSheet.getWritableCell(col, row);

        // 判断单元格的类型, 做出相应的转化

        if (cell.getType() == CellType.EMPTY)

        {

            Number lbl = new Number(col, row, num);

            if(null != format)

            {

                lbl.setCellFormat(format);

            } else

            {

                lbl.setCellFormat(cell.getCellFormat());

            }

            dataSheet.addCell(lbl);

        } else if (cell.getType() == CellType.NUMBER)

        {

            // 数字单元格修改

            Number lbl = (Number)cell;

            lbl.setValue(num);

        } else if (cell.getType() == CellType.LABEL)

        {

            Label lbl = (Label)cell;

            lbl.setString(String.valueOf(num));

        }

    }

   

    /**

     * 修改公式单元格的值

     * @param dataSheet WritableSheet : 工作表

     * @param col int : 列

     * @param row int : 行

     * @param startPos int : 开始位置

     * @param endPos int : 结束位置

     * @param format

     * @throws RowsExceededException

     * @throws WriteException

     */

    private void modiFormulaCell(WritableSheet dataSheet, int col, int row, int startPos, int endPos, CellFormat format) throws RowsExceededException, WriteException

    {

        String f = getFormula(col, row, startPos, endPos);

        // 插入公式(只支持插入,不支持修改)

        WritableCell cell = dataSheet.getWritableCell(col, row);

        if (cell.getType() == CellType.EMPTY)

        {                   

            // 公式单元格

            Formula lbl = new Formula(col, row, f);

            if(null != format)

            {

                lbl.setCellFormat(format);

            } else

            {

                lbl.setCellFormat(cell.getCellFormat());

            }

            dataSheet.addCell(lbl);

        } else if (cell.getType() == CellType.STRING_FORMULA)

        {

            YTLogger.logWarn("Formula modify not supported!");

        }

    }

   

    /**

     * 得到公式

     * @param col int : 列

     * @param row int : 行

     * @param startPos int : 开始位置

     * @param endPos int : 结束位置

     * @return String

     * @throws RowsExceededException

     * @throws WriteException

     */

    private String getFormula(int col, int row, int startPos, int endPos)

            throws RowsExceededException, WriteException

    {

        char base = 'A';

        char c1 = base;

        StringBuffer formula = new StringBuffer(128);

        // 组装公式

        formula.append("SUM(");

        if (col <= 25)

        {

            c1 = (char) (col % 26 + base);

            formula.append(c1).append(startPos).append(":")

                   .append(c1).append(endPos).append(")");

        } else if (col > 25)

        {

            char c2 = (char) ((col - 26) / 26 + base);

            c1 = (char) ((col - 26) % 26 + base);

            formula.append(c2).append(c1).append(startPos).append(":")

                   .append(c2).append(c1).append(endPos).append(")");

        }

 

        return formula.toString();

    }

   

    /**

     * 插入图表工作表

     * @param wwb WritableWorkbook : 工作簿

     * @param vecImg Vector : 图像链表

     * @throws RowsExceededException

     * @throws WriteException

     */

    private void insertImgsheet(WritableWorkbook wwb, Vector vecImg)

            throws RowsExceededException, WriteException

    {

        // 插入图像

        WritableSheet imgSheet;

        if((wwb.getSheets()).length < 2)

        {

            imgSheet = wwb.createSheet("图表", 1);

        } else

        {

            imgSheet = wwb.getSheet(1);

        }

       

        for (int i = 0; i < vecImg.size(); i++)

        {

            ChartImg chart = (ChartImg) vecImg.get(i);

            // 插入图像标题

            Label lbl = new Label(0, 2 + 20 * i, chart.getImgTitle());

            WritableFont font = new WritableFont(WritableFont.ARIAL,

                    WritableFont.DEFAULT_POINT_SIZE, WritableFont.NO_BOLD, false,

                    UnderlineStyle.NO_UNDERLINE, Colour.DARK_BLUE2);

            WritableCellFormat background = new WritableCellFormat(font);

            background.setWrap(true);

            background.setBackground(Colour.GRAY_25);

            imgSheet.mergeCells(0, 2 + 20 * i, 9, 2 + 20 * i);

            lbl.setCellFormat(background);

            imgSheet.addCell(lbl);

            // 插入图像单元格

            insertImgCell(imgSheet, 2, 4 + 20 * i, 8, 15, chart.getImgName());

        }

    }

 

    /**

     * 插入图像到单元格(图像格式只支持png)

     * @param dataSheet WritableSheet : 工作表

     * @param col int : 列

     * @param row int : 行

     * @param width int : 宽

     * @param height int : 高

     * @param imgName String : 图像的全路径

     * @throws RowsExceededException

     * @throws WriteException

     */

    private void insertImgCell(WritableSheet dataSheet, int col, int row, int width,

            int height, String imgName) throws RowsExceededException, WriteException

    {

        File imgFile = new File(imgName);

        WritableImage img = new WritableImage(col, row, width, height, imgFile);

        dataSheet.addImage(img);

    }

   

    /**

     * 测试

     * @param args

     */

    public static void main(String[] args)

    {

        XLSDemo demo = new XLSDemo();

        demo.makeXls();

    }

}

转载于:https://www.cnblogs.com/luffykingsc/archive/2013/04/16/3024919.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值