先说点废话:
Java操作Excel,其实很多项目只用到简单的数据导出,也就是“生成/获取数据”--》“生成文件”--》“写数据”;
但是在早些年楼主是做过数据完全存在Excel里面的项目的,拼接、读取,数据完全在Excel存储,现在这种项目应该不多了吧;
想把Demo尽可能的写的完善,但是又害怕不够通俗易懂,用起来又会不顺手;
此Demo实现的是:
将数据写入到Excel文件中,存储路径和Excel名称作为参数传入;
代码里有对*.xls 和 *.xlsx两种文件的判断;
如果Excel文件已经存在则清除数据并写入新的数据,如果文件不存在则创建;
代码:
Maven工程的话加依赖:
<!-- 引入poi,解析workbook视图 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>
<!-- 处理excel和上面功能是一样的-->
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.10</version>
</dependency>
方法体:
private static final String EXCEL_XLS = "xls"; //Excel 2003
private static final String EXCEL_XLSX = "xlsx"; // Excel 2007/2010
public static void writeExcel(List<Map> dataList, String finalXlsxPath) {
OutputStream out = null;
try {
// 读取Excel文档
File finalXlsxFile = new File(finalXlsxPath);
// 创建一个工作表
Workbook workBook = null;
Sheet sheet;
if (!finalXlsxFile.exists()) {
//如果文件不存在,创建一个
out = new FileOutputStream(finalXlsxPath);
// 根据目录(即文件名)创建一个适当的Excel文件
if (finalXlsxPath.endsWith(EXCEL_XLS)) { //Excel 2003
workBook = new HSSFWorkbook();
} else if (finalXlsxPath.endsWith(EXCEL_XLSX)) { // Excel 2007/2010
workBook = new XSSFWorkbook();
}
sheet = workBook.createSheet("表一");
sheet.createRow(0);
workBook.write(out);
out.flush();
} else {
//如果文件存在,读取文件内容
FileInputStream in = new FileInputStream(finalXlsxFile);
//获取文件版本
if (finalXlsxFile.getName().endsWith(EXCEL_XLS)) { //Excel 2003
workBook = new HSSFWorkbook(in);
} else if (finalXlsxFile.getName().endsWith(EXCEL_XLSX)) { // Excel 2007/2010
workBook = new XSSFWorkbook(in);
}
in.close();
}
// sheet 对应一个工作页
sheet = workBook.getSheetAt(0);
/**
* 删除原有数据,除了属性列
*/
int rowNumber = sheet.getLastRowNum(); // 第一行从0开始算
//如果文件存在清除文件内容(或者其他操作)Excel读取见下文
System.out.println("原始数据总行数,清除属性列:" + rowNumber);
for (int i = 1; i <= rowNumber; i++) {
Row row = sheet.getRow(i);
sheet.removeRow(row);
}
// 创建文件输出流,输出电子表格:这个必须有,否则你在sheet上做的任何操作都不会有效
out = new FileOutputStream(finalXlsxPath);
workBook.write(out);
/**
* 往Excel中写新数据
*/
// 添加表头行
Row hssfRow = sheet.createRow(0);
// 设置单元格格式居中
CellStyle cellStyle = workBook.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 添加表头内容
Cell headCell = hssfRow.createCell(0);
headCell.setCellValue("姓名");
headCell.setCellStyle(cellStyle);
headCell = hssfRow.createCell(1);
headCell.setCellValue("地址");
headCell.setCellStyle(cellStyle);
headCell = hssfRow.createCell(2);
headCell.setCellValue("电话");
headCell.setCellStyle(cellStyle);
//数据写入
for (int j = 0; null != dataList && j < dataList.size(); j++) {
// 创建一行:从第二行开始,跳过属性列
Row row = sheet.createRow(j + 1);
// 得到要插入的每一条记录
Map dataMap = dataList.get(j);
//写入
Cell first = row.createCell(0);
first.setCellValue(MapUtils.getString(dataMap, "BankName"));
Cell second = row.createCell(1);
second.setCellValue(MapUtils.getString(dataMap, "Addr"));
Cell third = row.createCell(2);
third.setCellValue(MapUtils.getString(dataMap, "Phone"));
}
// 创建文件输出流,准备输出电子表格:这个必须有,否则你在sheet上做的任何操作都不会有效
out = new FileOutputStream(finalXlsxPath);
workBook.write(out);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.flush();
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("数据导出成功");
}
测试:
public static void main(String[] args) {
List<Map> list = new ArrayList<Map>();
for (int i = 0; i < 10; i++) {
Map<String, String> dataMap = new HashMap<String, String>();
dataMap.put("BankName", "BankName" + i);
dataMap.put("Addr", "Addr" + i);
dataMap.put("Phone", "Phone" + i);
list.add(dataMap);
}
writeExcel(list, 3, "D:/writeExcelTest.xls");
}
结果:
其他地方需要改的直接改,如果那里写得不好欢迎指出;相互学习;