要用Java操作Excel文件需要使用到一个Jar包:jxl.jar,所以首先需要从网上下载这个Jar包。
要读取的Excel文件如下图所示:
文件名为“Example.xls”,里边有两个工作表,第一个工作表的名字为“Product”,第二个工作表的名字为“Customer”。我们将分别读取这个Excel文件中的两个工作表中的内容,并打印出来。
代码如下:
package cn.com.huixin.exercise; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.text.DateFormat; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; import jxl.Cell; import jxl.CellType; import jxl.DateCell; import jxl.NumberCell; import jxl.Sheet; import jxl.Workbook; import jxl.read.biff.BiffException; public class ExcelFileOperation { public static void main(String[] args) throws IOException { int rows = 0; int columns = 0; double doublue = 0.0; String content = null; String[] columnName = null; StringBuffer buffer = null; InputStream inputStream = null; Workbook workbook = null; Sheet[] sheets = null; Cell cell = null; NumberCell numberCell = null; DateCell dateCell = null; Date date = null; DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); DecimalFormat decimalFromat2 = new DecimalFormat(".00"); DecimalFormat decimalFromat6 = new DecimalFormat(".000000"); try { // 获取Excel文件输入流 inputStream = new FileInputStream("F:\\Files\\Example.xls"); // 获取工作簿 workbook = Workbook.getWorkbook(inputStream); // 获取工作表 sheets = workbook.getSheets(); for (Sheet sheet : sheets) { // 获取工作表名为"Product"的对象 if ("Product".equals(sheet.getName())) { buffer = new StringBuffer("产品信息:\n"); // 获取工作表中的行数 rows = sheet.getRows(); // 获取工作表中的列数 columns = sheet.getColumns(); // 获取列名 columnName = new String[columns]; for (int i = 0; i < columns; i++) { columnName[i] = sheet.getCell(i, 0).getContents(); } // 读取单元格中的内容 for (int i = 1; i < rows; i++) { for (int j = 0; j < columns; j++) { if (j > 0) { buffer.append(", "); } cell = sheet.getCell(j, i); content = cell.getContents(); if ("单价".equals(columnName[j])) { buffer.append(columnName[j] + ": "); // 如果单元格中的内容是数字格式,则将该单元格(cell)强制装换为NumberCell,然后调用该对象(numberCell)的getValue()方法来获取值,而不是调用cell的getContents()方法. if ((content != null) && (CellType.NUMBER == cell.getType())) { numberCell = (NumberCell) cell; // 此处如果不做强制转换的处理,直接调用cell的getContents()方法来获取值得话,则3.838125取出之后就会变成3.838。 doublue = numberCell.getValue(); content = decimalFromat2.format(doublue); } } else if ("总额(万元)".equals(columnName[j])) { buffer.append("总额: "); if ((content != null) && (CellType.NUMBER == cell.getType())) { numberCell = (NumberCell) cell; doublue = numberCell.getValue(); // 此处使用DecimalFormat的目的是指定Double类型的精确度,即精确到小数点后几位,否则JRE就会自动精确到小数点后12位,这不符合我们的要求。 content = decimalFromat6.format(doublue * 10000); } } else if ("购买日期".equals(columnName[j])) { buffer.append(columnName[j] + ": "); // 如果是日期格式,则将cell对象强制转换为DateCell,然后调用DateCell的getDate()来获取单元格的内容。 if ((content != null) && (CellType.DATE == cell.getType())) { dateCell = (DateCell) cell; date = dateCell.getDate(); // 调用DateFormat的format()方法来格式化日期对象 。 content = dateFormat.format(date); } } else { buffer.append(columnName[j] + ": "); } buffer.append(content); } buffer.append("\n"); } System.out.println(buffer.toString()); } // 获取工作表名为"Customer"的对象 if ("Customer".equals(sheet.getName())) { buffer = new StringBuffer("客户信息:\n"); rows = sheet.getRows(); columns = sheet.getColumns(); columnName = new String[columns]; for (int i = 0; i < columns; i++) { columnName[i] = sheet.getCell(i, 0).getContents(); } // 读取单元格中的内容 for (int i = 1; i < rows; i++) { for (int j = 0; j < columns; j++) { if (j > 0) { buffer.append(", "); } cell = sheet.getCell(j, i); content = cell.getContents(); if ("消费总额(万元)".equals(columnName[j])) { buffer.append("消费总额: "); if ((content != null) && (CellType.NUMBER == cell.getType())) { numberCell = (NumberCell) cell; doublue = numberCell.getValue(); content = decimalFromat6.format(doublue * 10000); } } else if ("消费日期".equals(columnName[j])) { buffer.append(columnName[j] + ": "); if ((content != null) && (CellType.DATE == cell.getType())) { dateCell = (DateCell) cell; date = dateCell.getDate(); content = dateFormat.format(date); } } else { buffer.append(columnName[j] + ": "); } buffer.append(content); } buffer.append("\n"); } System.out.println(buffer.toString()); } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (BiffException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { workbook.close(); inputStream.close(); } } }下来进行写Excel文件的操作,最终的Excel文件效果如下图所示:
代码如下:
package cn.com.huixin.exercise; import java.io.File; import java.io.IOException; import jxl.Workbook; import jxl.format.Alignment; import jxl.format.Colour; import jxl.write.Label; import jxl.write.WritableCellFormat; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; public class OperteExcel { public void writeExcel() throws WriteException, IOException { WritableWorkbook writableWorkbook = null; WritableSheet writableSheet = null; WritableCellFormat format_title = null; Label label = null; try { // 指定文件的路径及文件名 writableWorkbook = Workbook.createWorkbook(new File("F:\\Exercise.xls")); // Excel文件中的工作表。"图书信息"为工作表名,"0"为该工作表的顺序,从0开始 writableSheet = writableWorkbook.createSheet("图书信息", 0); // 设置单元格格式 format_title = new WritableCellFormat(); // 设置标题栏的背景色 format_title.setBackground(Colour.GRAY_25); // 设置标题栏中文本的对齐方式为居中对齐 format_title.setAlignment(Alignment.CENTRE); // 构造单元格中的Label对象。第一个0为列号,第二个0为行号,"ISBN"为单元格中的内容 label = new Label(0, 0, "ISBN", format_title); // 添加单元格 writableSheet.addCell(label); label = new Label(1, 0, "书名", format_title); writableSheet.addCell(label); label = new Label(2, 0, "出版社", format_title); writableSheet.addCell(label); label = new Label(3, 0, "作者", format_title); writableSheet.addCell(label); label = new Label(4, 0, "价格", format_title); writableSheet.addCell(label); label = new Label(0, 1, "9787302204015"); writableSheet.addCell(label); label = new Label(1, 1, "计算机网络(第2版)"); writableSheet.addCell(label); label = new Label(2, 1, "清华大学出版社"); writableSheet.addCell(label); label = new Label(3, 1, "胡道元"); writableSheet.addCell(label); label = new Label(4, 1, "39"); writableSheet.addCell(label); label = new Label(0, 2, "978-7-121-09669-3"); writableSheet.addCell(label); label = new Label(1, 2, "西门子PLC编程指令与梯形图快速入门 "); writableSheet.addCell(label); label = new Label(2, 2, "电子工业出版社 "); writableSheet.addCell(label); label = new Label(3, 2, "李若谷 "); writableSheet.addCell(label); label = new Label(4, 2, "24 "); writableSheet.addCell(label); label = new Label(0, 3, "978-7-04-016550-0"); writableSheet.addCell(label); label = new Label(1, 3, "工业设计工程基础Ⅰ——材料及加工技术基础"); writableSheet.addCell(label); label = new Label(2, 3, "高等教育出版社"); writableSheet.addCell(label); label = new Label(3, 3, "赵英新"); writableSheet.addCell(label); label = new Label(4, 3, "29"); writableSheet.addCell(label); // 输出Excel文件 writableWorkbook.write(); } catch (IOException e) { e.printStackTrace(); } finally { if (writableWorkbook != null) { writableWorkbook.close(); } } } public static void main(String[] args) { OperteExcel operteExcel = new OperteExcel(); try { operteExcel.writeExcel(); } catch (WriteException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }