要用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();
}
}
}