Java——关于Excle表格的操作
目录
1.使用poi工具
pom.xml中添加依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
2.读取Excel源标题、源数据、总行数、总列数
/**
* 读Excel的方法readExcel,该方法的入口参数为一个File对象
* @param file
* @return
*/
public static Map readExcel(File file) {
Map map = new HashMap();
try {
// 创建输入流,读取Excel
InputStream is = new FileInputStream(file.getAbsolutePath());
// jxl提供的Workbook类
jxl.Workbook wb = jxl.Workbook.getWorkbook(is);
// Excel的页签数量
int sheet_size = wb.getNumberOfSheets();
if(sheet_size > 1){
return null;
}
//获取原标题
List oldTitleRow = new ArrayList();
List<Object> outerList = new ArrayList<Object>();
// 每个页签创建一个Sheet对象
jxl.Sheet sheet = wb.getSheet(0);
//sheet.getRows()返回该页的总行数
for (int i = 0; i < sheet.getRows(); i++) {
Map innerMap = new HashMap();
String cellinfo = "";
// sheet.getColumns()返回该页的总列数
for (int j = 0; j < sheet.getColumns(); j++) {
cellinfo = sheet.getCell(j, i).getContents();
//如果是第3行,取出数据作为oldTitleRow行
if(i == 2){
oldTitleRow.add(cellinfo);
}
if(i > 2){
innerMap.put(j, cellinfo);
}
}
//只取出第3行以及第三之后的数据
if(i > 2){
outerList.add(innerMap);
}
}
//保存源标题、源数据、总行数、总列数
map.put("oldTitleRow", oldTitleRow);
map.put("dataList", outerList);
map.put("rowNum", sheet.getRows()-3);
map.put("columnNum", sheet.getColumns());
return map;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (BiffException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
3.导出excel表格
/**
* 导出excel表格
* @param dataList 被导出的数据
* @param cloumnCount 总列数
* @param newTitleRow 标题行
* @param finalXlsxPath 导出路径
*/
public static void writeExcel(List<Map> dataList, int cloumnCount,List newTitleRow, String finalXlsxPath) {
OutputStream out = null;
try {
// 获取总列数
int columnNumCount = cloumnCount;
// 创建空的Excel文档,并加上title
createExcel(finalXlsxPath,"Template", newTitleRow);
File finalXlsxFile = new File(finalXlsxPath);
Workbook workBook = getWorkbok(finalXlsxFile);
// sheet 对应一个工作页
Sheet sheet = workBook.getSheetAt(0);
// 创建文件输出流,输出电子表格:这个必须有,否则你在sheet上做的任何操作都不会有效
out = new FileOutputStream(finalXlsxPath);
workBook.write(out);
/**
* 往Excel中写新数据
*/
for (int j = 0; j < dataList.size(); j++) {
// 创建一行:从第二行开始,跳过属性列
Row row = sheet.createRow(j + 1);
// 得到要插入的每一条记录
Map dataMap = dataList.get(j);
for (int k = 0; k < columnNumCount; k++) {
String data = dataMap.get(k).toString();
// 在一行内循环
Cell cell = row.createCell(k);
cell.setCellValue(data);
}
}
// 创建文件输出流,准备输出电子表格:这个必须有,否则你在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("数据导出成功");
}
4.创建新的excel表格
/**
* 创建新excel
* @param fileDir excel的路径
* @param sheetName 要创建的表格索引
* @param newTitleRow 要创建的表格标题
*/
public static void createExcel(String fileDir,String sheetName, List<String> newTitleRow){
//判断文件是否存在
if(fileExist(fileDir)){
deleteExcel(fileDir);
}
//创建workbook
HSSFWorkbook workbook = new HSSFWorkbook();
//添加Worksheet(不添加sheet时生成的xls文件打开时会报错)
HSSFSheet sheet1 = workbook.createSheet(sheetName);
//新建文件
FileOutputStream out = null;
try {
//添加表头
HSSFRow row = workbook.getSheet(sheetName).createRow(0); //创建第一行
for(int i = 0;i < newTitleRow.size();i++){
HSSFCell cell = row.createCell(i);
cell.setCellValue(newTitleRow.get(i));
}
out = new FileOutputStream(fileDir);
workbook.write(out);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
5.判断Excel文件版本
/**
* 判断Excel的版本,获取Workbook
* @param file
* @return
*/
public static Workbook getWorkbok(File file) {
Workbook wb = null;
try {
FileInputStream in = new FileInputStream(file);
if (file.getName().endsWith(EXCEL_XLS)) { //Excel 2003
wb = new HSSFWorkbook(in);
} else if (file.getName().endsWith(EXCEL_XLSX)) { // Excel 2007/2010
wb = new XSSFWorkbook(in);
}
} catch (IOException e) {
e.printStackTrace();
}
return wb;
}
6.其他
/**
* 判断文件是否存在.
* @param fileDir 文件路径
* @return
*/
public static boolean fileExist(String fileDir){
boolean flag = false;
File file = new File(fileDir);
flag = file.exists();
return flag;
}
/**
* 删除文件.
* @param fileDir 文件路径
*/
public static boolean deleteExcel(String fileDir) {
boolean flag = false;
File file = new File(fileDir);
// 判断目录或文件是否存在
if (!file.exists()) { // 不存在返回 false
return flag;
} else {
// 判断是否为文件
if (file.isFile()) { // 为文件时调用删除文件方法
file.delete();
flag = true;
}
}
return flag;
}
OK, GAME OVER!