了解
Excel2003和Excel2007的区别如下:
(1)Excel2003的保存格式为duxxx.xls,其后缀名为.xls;Excel2007的保存格式为xxx.xlsx,其后缀名名为.xlsx。
(2)Excel2003表格共有65536行,256列;Excel2007表格共有1048576行,16384列。
(1).pom.xml中导入依赖
<!-- 使用poi操作Excel所需要的的依赖 -->
<dependency> <!-- 03(xls) 最多65536行-->
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency> <!-- 07(xlsx) -->
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<!-- 日期格式化工具new DateTime().toString("yyyy-MM-dd HH:mm:ss") -->
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.0.1</version>
</dependency>
(2).准备实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student implements Serializable {
private int id;
private String name;
private int age;
private String gender;
public List<String> convertObj2List() {
List<String> ret = new ArrayList<>();
ret.add(this.id + "");
ret.add(this.name);
ret.add(this.age + "");
ret.add(this.gender);
return ret;
}
}
(3).创建Excel工作簿
public class WriteExcelUtils {
private final static String EXCEL2003 = "xls";
private final static String EXCEL2007 = "xlsx";
/**
*
* @param sheetName sheet工作表名称
* @param headList Excel第一行表头信息
* @param dataList Excel具体数据信息
* @param path 生成的Excel的保存路径
* @return
*/
public static boolean createWorkBook(String sheetName, List<String> headList, List<List<String>> dataList, String path) {
// 创建03/07版本的工作簿
Workbook wb = null;
if(path.endsWith(EXCEL2003)) wb = new HSSFWorkbook(); // 03版xls
if(path.endsWith(EXCEL2007)) {
wb = new XSSFWorkbook();// 07版xlsx
// new SXSSFWorkbook() => 07版xlsx升级版XSSFWorkbook,加快速度
}
//创建工作表
Sheet sheet = wb.createSheet(sheetName != null ? sheetName : "new sheet");
//设置字体
Font headFont = wb.createFont();
headFont.setFontHeightInPoints((short) 14);
headFont.setFontName("Courier New");
headFont.setItalic(false);
headFont.setStrikeout(false);
//设置头部单元格样式
CellStyle headStyle = wb.createCellStyle();
//设置单元格下线条及颜色
headStyle.setBorderBottom(BorderStyle.THIN);
headStyle.setBottomBorderColor(IndexedColors.BLUE.getIndex());
//设置单元格左线条及颜色
headStyle.setBorderLeft(BorderStyle.THIN);
headStyle.setLeftBorderColor(IndexedColors.BLUE.getIndex());
//设置单元格又线条及颜色
headStyle.setBorderRight(BorderStyle.THIN);
headStyle.setRightBorderColor(IndexedColors.BLUE.getIndex());
//设置单元格线条及颜色
headStyle.setBorderTop(BorderStyle.THIN);
headStyle.setTopBorderColor(IndexedColors.BLUE.getIndex());
//设置水平对齐方式
headStyle.setAlignment(HorizontalAlignment.CENTER);
//设置垂直对齐方式
headStyle.setVerticalAlignment(VerticalAlignment.CENTER);
headStyle.setFont(headFont); //设置字体
Row headRow = sheet.createRow(0);
CreationHelper createHelper = wb.getCreationHelper();
for (int i = 0; i < headList.size(); i++) {
//遍历表头数据
Cell cell = headRow.createCell(i); //创建单元格
cell.setCellValue(createHelper.createRichTextString(headList.get(i))); //设置值
cell.setCellStyle(headStyle); //设置样式
}
int rowIndex = 1; //当前行索引
//创建Rows
//设置数据单元格格式
CellStyle dataStyle = wb.createCellStyle();
dataStyle.setBorderBottom(BorderStyle.THIN); //设置单元格线条
dataStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); //设置单元格颜色
dataStyle.setBorderLeft(BorderStyle.THIN);
dataStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
dataStyle.setBorderRight(BorderStyle.THIN);
dataStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
dataStyle.setBorderTop(BorderStyle.THIN);
dataStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
dataStyle.setAlignment(HorizontalAlignment.LEFT); //设置水平对齐方式
dataStyle.setVerticalAlignment(VerticalAlignment.CENTER); //设置垂直对齐方式
for (List<String> rowdata : dataList) {
//遍历所有数据
Row row = sheet.createRow(rowIndex++); //第一行为头
for (int j = 0; j < rowdata.size(); j++) {
//编译每一行
Cell cell = row.createCell(j);
cell.setCellStyle(dataStyle);
cell.setCellValue(createHelper.createRichTextString(rowdata.get(j)));
}
}
/*设置列自动对齐*/
for (int i = 0; i < headList.size(); i++) {
sheet.autoSizeColumn(i);
}
try (OutputStream fileOut = new FileOutputStream(path)) {
//获取文件流
wb.write(fileOut); //将workbook写入文件流
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
}
(4)读取Excel工作簿
public class ReadExcelUtils {
/**
* @param path 读取的Excel的路径
* @param sheetName sheet工作表名称
* @throws IOException
*/
public static void readExcel(String path, String sheetName) throws IOException {
//创建输入流
FileInputStream fileInputStream = new FileInputStream(path);
//获得poi输入流
POIFSFileSystem poifsFileSystem = new POIFSFileSystem(fileInputStream);
//获得文档
HSSFWorkbook Workbook = new HSSFWorkbook(poifsFileSystem);
//根据name获取sheet表
HSSFSheet sheet = Workbook.getSheet(sheetName);
// Workbook.getNumberOfSheets() =>获取这个工作簿的所有sheet个数
//获得行数,下标从0开始
int lastRow = sheet.getLastRowNum();// 或者sheet.getPhysicalNumberOfRows()
System.out.println("行数:" + (lastRow + 1));
//获取第二行(第一行一般是标题)
HSSFRow row = sheet.getRow(1);
//获得列数,下标从1开始
int lastCell = row.getLastCellNum();// 或者row.getPhysicalNumberOfCells()
System.out.println("列数:" + lastCell);
for (int i = 0; i <= lastRow; i++) {
//遍历每一行
row = sheet.getRow(i);
if (row != null) {
for (int j = 0; j < lastCell; j++) {
//遍历每一列的cell
HSSFCell cell = row.getCell(j);
if (cell != null) {
String value = "";
switch (cell.getCellType()) {
//SwitchCase判断单元格的类型
case STRING: // 字符串类型
value = cell.getStringCellValue();
break;
case BOOLEAN: // Boolean类型
value = String.valueOf(cell.getBooleanCellValue());
break;
case NUMERIC: // 数值(日期,普通数字)
if (HSSFDateUtil.isCellDateFormatted(cell)) {
// 日期
value = new DateTime(cell.getDateCellValue()).toString("yyyy-MM-dd HH:mm:ss");
} else {
// 普通数字
cell.setCellType(STRING);// 防止数字过长转成String
value = cell.toString();
}
break;
case FORMULA: // 计算公式
String cellFormula = cell.getCellFormula(); //获取计算公式
System.out.println(cellFormula);
// 根据计算公式计算
CellValue evaluate = Workbook.getCreationHelper().createFormulaEvaluator().evaluate(cell);
value = evaluate.formatAsString();
break;
case BLANK: // 空值
value = "";
break;
case ERROR: // 类型错误
value = "类型错误";
break;
default:
value = "未知类型";
break;
}
System.out.print(value + " ");
}
}
System.out.println();
}
}
fileInputStream.close();
}
}
(4).测试
public class TestExcel {
public static void main(String[] args) throws Exception {
//创建一个Excel
List<Student> list = new ArrayList<>();
list.add(new Student(1, "ali123", 34, "男"));
list.add(new Student(2, "xiaoli123", 3, "男"));
list.add(new Student(3, "zhangli123", 34, "男"));
List<List<String>> ret = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
List<String> obj2List = list.get(i).convertObj2List();
ret.add(obj2List);
}
WriteExcelUtils.createWorkBook("test", Arrays.asList(new String[]{
"编号","姓名","年龄","性别"}),ret,"D:/1.xls");
//读取excel
ReadExcelUtils.readExcel("D:/1.xls", "test");
}
}
(5).测试结果