本文主要是介绍使用JXL读取Excel表格,拷贝、更新Excel工作薄,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- /**
- * <p>读取Excel表格,拷贝、更新Excel工作薄 </p>
- * <p>Description: 可以读取Excel文件的内容,更新Excel工作薄
- * </p>
- * <p>Copyright: Copyright (c) Corparation 2005</p>
- * <p>程序开发环境为eclipse</p>
- * @author Walker
- * @version 1.0
- */
- 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 <SPAN class=hilite1>jxl</SPAN>.CellType;
- import <SPAN class=hilite1>jxl</SPAN>.Workbook;
- import <SPAN class=hilite1>jxl</SPAN>.format.CellFormat;
- import <SPAN class=hilite1>jxl</SPAN>.format.Colour;
- import <SPAN class=hilite1>jxl</SPAN>.format.UnderlineStyle;
- import <SPAN class=hilite1>jxl</SPAN>.write.Formula;
- import <SPAN class=hilite1>jxl</SPAN>.write.Label;
- import <SPAN class=hilite1>jxl</SPAN>.write.Number;
- import <SPAN class=hilite1>jxl</SPAN>.write.WritableCell;
- import <SPAN class=hilite1>jxl</SPAN>.write.WritableCellFormat;
- import <SPAN class=hilite1>jxl</SPAN>.write.WritableFont;
- import <SPAN class=hilite1>jxl</SPAN>.write.WritableImage;
- import <SPAN class=hilite1>jxl</SPAN>.write.WritableSheet;
- import <SPAN class=hilite1>jxl</SPAN>.write.WritableWorkbook;
- import <SPAN class=hilite1>jxl</SPAN>.write.WriteException;
- import <SPAN class=hilite1>jxl</SPAN>.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);
- }
- // <SPAN class=hilite2>插入公式</SPAN>
- 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);
- // <SPAN class=hilite2>插入公式</SPAN>(只支持插入,不支持修改)
- 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();
- }
- }
这篇关于使用JXL读取Excel表格,拷贝、更新Excel工作薄的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!