1、导入相关依赖
maven依赖
<!-- excel读取 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.0</version>
</dependency>
2、编写ReadExcel.java
package com.hx.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* @author Huathy
* @time 2020年3月27日 上午10:49:21
*/
@SuppressWarnings("resource")
public class ReadExcel {
private DecimalFormat df = new DecimalFormat("0.00");
// 将double类型的值小数位保留2位
/**
* 通过文件方式,将一个Excel中的数据读取到一个集合中
* @param file
* @return
* @throws IOException
* @throws FileNotFoundException
*/
public List<Map<String, String>> importExcel(File fl) throws FileNotFoundException, IOException {
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
// 创建一个excel对象
Workbook workbook = null;
String fileName = fl.getName().toLowerCase(); // 获取文件名
if (fileName.endsWith("xls")) {
workbook = new HSSFWorkbook(new FileInputStream(fl));
} else if (fileName.endsWith("xlsx")) {
workbook = new XSSFWorkbook(new FileInputStream(fl));
} else {
throw new RuntimeException("选择的文件不是Excel格式文件...");
}
// 获取excel中的Sheet1表(即默认的第一张表)
Sheet sheet = workbook.getSheet("Sheet1");
int rows = sheet.getLastRowNum(); // 获取表格的最后一行编号
if (rows <= 0) { // 如果小于0,则表示表格中没有数据。
throw new RuntimeException("表格中没有数据...");
}
// 循环读取每一行数据
Row row = null;
Iterator<Cell> cols = null;
Map<String, String> map = null;
int index = 0; // 列
for (int i = 0; i <= rows; i++) { //从第一行开始读
index = 0;
row = sheet.getRow(i); //获取这一行的列信息
if (row == null) {
continue;
}
cols = row.cellIterator(); // 获取这一行中的所有列的信息
map = new HashMap<String, String>();
while (cols.hasNext()) {
map.put("第"+String.valueOf(index+1)+"列", getCelltoString(cols.next())); //cols.next()获取单元格中的值
index++;
}
list.add(map);
}
return list;
}
/**
* 通过流的方式读取excel文件
* @param fileName
* @param is
* @return
* @throws IOException
*/
public List<Map<String,String>> importExcel(String fileName ,InputStream is) throws IOException{
List<Map<String,String>> list = new ArrayList<Map<String,String>>();
//创建一个excel对象
Workbook workbook = null;
fileName= fileName.toLowerCase(); //获取文件名
if(fileName.endsWith("xls")){
workbook = new HSSFWorkbook(is);
}else if(fileName.endsWith("xlsx")){
workbook = new XSSFWorkbook(is);
}else{
throw new RuntimeException("选择的文件不是Excel格式文件...");
}
//获取excel中的一张表
Sheet sheet = workbook.getSheet("Sheet1");
int rows = sheet.getLastRowNum(); //获取表格的最后一行编号
if(rows <= 0){ //小于0,说明没有数据
throw new RuntimeException("表格中没有数据...");
}
//循环读取每一行数据
Row row = null;
Iterator<Cell> cols = null;
Map<String,String> map = null;
int index = 0; //列
for(int i=0; i<=rows; i++){ //从第一行开始读取
index = 0;
row = sheet.getRow(i);
if(row == null){
continue;
}
cols = row.cellIterator(); //获取这一行中的所有列
map = new HashMap<String,String>();
while( cols.hasNext() ){
map.put("第"+String.valueOf(index+1)+"列", getCelltoString(cols.next()));
index++;
}
list.add(map);
}
return list;
}
/**
* 将单元格中的数据转成字符串返回
*
* @param cell
* @return
*/
private String getCelltoString(Cell cell) {
if (cell == null) {
return "";
}
String str = "";
switch (cell.getCellType()) {
case STRING: //string
str = cell.getStringCellValue(); break;
case NUMERIC: //数值型,转为string
str = String.valueOf(df.format(cell.getNumericCellValue())); break;
case BOOLEAN: //Boolean型
str = String.valueOf(cell.getBooleanCellValue()); break;
case FORMULA: //公式
str = String.valueOf(cell.getCellFormula()); break;
case BLANK: //空白
str = ""; break;
case ERROR: //错误
str = ""; break;
default:
str = "";
}
return str;
}
}
3、编写WriteExcel.java
package com.hx.util;
import java.io.FileOutputStream;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* @author Huathy
* @time 2020年3月27日 上午10:49:09
*/
public class WriteExcelXls {
/**
*
* @param path 文件保存路径,仅支持xls格式
* @throws Exception
*/
public void WriteXls(List<List<String>> lists,String path) throws Exception{
if(lists.isEmpty()){
throw new Exception("集合中没有数据...");
}
String fileFormat = path.substring( path.lastIndexOf(".")+1 );
//创建一下工作簿
Workbook wb = null;
if( "xls".equals(fileFormat) ){ //以xls格式结尾,创建HSSFWorkbook对象
wb = new HSSFWorkbook();
}else if( "xlsx".equals(fileFormat) ){ //以xls格式结尾,创建XSSFWorkbook对象
wb = new XSSFWorkbook();
}else {
throw new Exception("文件保存格式错误...");
}
//创建Sheet1页面
Sheet sheet = wb.createSheet("Sheet1");
List<String> rowData = null;
//开始写数据
for(int i=0;i<lists.size();i++){
//获取每行的数据
rowData = lists.get(i);
//创建单元格,括号中的数字表示该行的第几列,从0开始
Row row = sheet.createRow(i);
for(int j=0;j<rowData.size();j++){
//创建单元格并赋值
row.createCell(j).setCellValue(rowData.get(j));
}
}
FileOutputStream fos = new FileOutputStream(path);
wb.write(fos);
fos.close();
wb.close();
System.out.println(path+" 文件写成功!");
}
}
4、编写测试类,测试读写
package com.hx.ExcelWR;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.hx.util.ReadExcel;
import com.hx.util.WriteExcelXls;
/**
* @author Huathy
* @time 2020年3月27日 上午10:48:59
*/
public class App {
public static void main(String[] args) {
String path = "G:\\ExcelRW.xlsx";
File file = new File(path);
List<List<String>> temp = null;
try {
//读取Excel文件测试
ReadExcel re = new ReadExcel();
List<Map<String, String>> list = re.importExcel(file);
System.out.println(list);
//数据处理,由于我读取数据是List<Map<String, String>>的,但写的时候需要List<String>的参数。故需要对数据进行处理
temp = new ArrayList<List<String>>();
List<String> strs = null;
Map<String,String> map = null;
for(int i=0;i<list.size();i++){
strs = new ArrayList<String>();
map = list.get(i);
for(int j=0;j<map.size();j++){
strs.add(map.get("第"+(j+1)+"列"));
}
temp.add(strs);
}
} catch (IOException e) {
e.printStackTrace();
}
//测试写Excel功能
WriteExcelXls wex = new WriteExcelXls();
try {
wex.WriteXls(temp, "G:\\a.xls"); //测试xls格式
wex.WriteXls(temp, "G:\\a.xlsx"); //测试xlsx格式
} catch (Exception e) {
e.printStackTrace();
}
}
}
读写测试Excel表格及结果
附:DecimalFormat
DecimalFormat df = new DecimalFormat(“0”);
变量 | 含义 |
---|---|
“0” | //不保留小数 |
“0.0” | 保留1位小数 |
“00.000” | 2整数位,3小数位 |
“#” | 取所有整数部分 |
“#.##%” | 以百分比方式计数,并取2位小数 |
“#.##E0” | 显示为科学计数法,并取2位小数 |
“,###” | 每三位以逗号进行分隔 |
“第#列” | //不保留小数 |