如何使用Java如何读写Excel?
参考自狂神说java,视频说的很详细,讲述了POI和EasyExcel两种方式。这里只是简单介绍一下POI的使用。EasyExcel参考官方文档,很详细。EasyExcel官方文档
话不多说,直接上代码:
<!--对应2003版Excel文件 即后缀名为xls的文件-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<!--2007版Excel文件,后缀名为xlsx的文件-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
注意:上述两种依赖,根据需要操作的Excel文件类型,自行选择即可。第一个依赖对应2003版及2003之前的版本,可以操作xls文件。第二个依赖对应2007版及之后的版本。本文的示例代码以操作xls文件为例。
2.写操作代码示例
- 数据量很少的情况
public void testWriter() throws IOException {
//创建一个工作簿workbook---可以包含多个工作表--sheet
Workbook workbook=new HSSFWorkbook();
//创建工作表
Sheet sheet = workbook.createSheet("表一");
//创建行--0表示第一行
Row row = sheet.createRow(0);
//创建单元格,0表示第一列
Cell cell11 = row.createCell(0);
cell11.setCellValue("观众人数");
Cell cell12 = row.createCell(1);
cell12.setCellValue(666);
//第二行
Row row2 = sheet.createRow(1);
Cell cell21 = row2.createCell(0);
cell21.setCellValue("统计时间xls");
Cell cell22 = row2.createCell(1);
cell22.setCellValue(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new Date(System.currentTimeMillis())));
FileOutputStream out=new FileOutputStream("D:\\JavaStudy\\use-excel\\狂神观众表.xls");
//将数据写入输出流中
workbook.write(out);
out.close();
}
- 如果要写的数据很多,用循环即可。
public void writeBigDataHSSF() throws IOException {
long start = System.currentTimeMillis();
Workbook workbook = new HSSFWorkbook();
Sheet sheet = workbook.createSheet("一张普通的表xls");
Row row=null;
Cell cell;
for (int rowNum = 0; rowNum < 65535; rowNum++) {
row=sheet.createRow(rowNum);
for (int i = 0; i < 10; i++) {
cell=row.createCell(i);
cell.setCellValue(rowNum+"个人觉得你帅");
}
}
FileOutputStream outputStream=new FileOutputStream("D:\\JavaStudy\\use-excel\\bigdata07.xls");
workbook.write(outputStream);
outputStream.close();
long end=System.currentTimeMillis();
System.out.println("输出成功,花费的时间为:"+(end-start)/1000);
}
3.读操作的代码示例
public void testReadHSSF() throws IOException {
InputStream inputStream=new FileInputStream("D:\\JavaStudy\\use-excel\\狂神观众表.xls");
Workbook workbook=new HSSFWorkbook(inputStream);
Sheet sheet = workbook.getSheetAt(0);
Row row = null;
Cell cell=null;
int rowCount = sheet.getPhysicalNumberOfRows();
int cellCount=0;
for (int i = 0; i < rowCount; i++) {
row = sheet.getRow(i);
cellCount=row.getPhysicalNumberOfCells();
for (int j = 0; j < cellCount; j++) {
cell=row.getCell(j);
//获取单元格中的数据类型
CellType cellType = cell.getCellType();
switch (cellType){
case STRING:{
System.out.print(cell.getStringCellValue());
break;}
case NUMERIC:{
System.out.print(cell.getNumericCellValue());
break;}
default:
System.out.println("default msg");
break;
}
}
System.out.println();
}
System.out.println();
inputStream.close();
}
4.Excel单元格相关操作
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
import java.awt.Color;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class ExcelTest {
public static void main(String[] args) {
//创建工作簿
XSSFWorkbook workbook=new XSSFWorkbook();
//设置单元格样式
XSSFCellStyle cellStyle = workbook.createCellStyle();//创建一个单元格样式对象
cellStyle.setAlignment(HorizontalAlignment.CENTER);//设置水平对齐方式,这里是 居中
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//设置垂直对齐
//设置单元格的背景颜色,其中setFillPattern(),即:设置填充图案。这个必须设置,因为必须先有图案,才会有前景和背景的概念。。。
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);//参数是一个枚举类型,此类型只会展示前景颜色,故而不用设置背景颜色
cellStyle.setFillBackgroundColor(new XSSFColor(Color.BLUE,new DefaultIndexedColorMap()));//因为上一行的配置,此行配置无效,可删
cellStyle.setFillForegroundColor(new XSSFColor(Color.YELLOW,new DefaultIndexedColorMap()));//前景颜色为黄色
//字体设置
Font font=workbook.createFont();//注意:字体不要自己去 new HSSFFont() 或者 new XSSFFont(),要用workbook,这样才是给当前工作簿设置字体
font.setBold(true);//设置是否加粗
font.setFontName("楷体");//这里采用楷体
font.setFontHeightInPoints((short)16);//设置字体的大小 与这个相似的方法有setFontHeight(),该方法设置的大小要除以20
font.setColor(IndexedColors.RED.index);// 设置颜色
cellStyle.setFont(font);//将字体添加到单元格样式中去,因为我们要设置的就是单元格的字体
//创建工作表
XSSFSheet sheet = workbook.createSheet("测试样式2");
sheet.addMergedRegion(new CellRangeAddress(0,0,1,2));// 合并第2、3个单元格,此操作不属于单元格内的操作,不需要添加到cellStyle中去
XSSFRow row = sheet.createRow(0);
//根据行对象row 创建以下四个单元格对象
XSSFCell cell0 = row.createCell(0);
XSSFCell cell1 = row.createCell(1);
XSSFCell cell2 = row.createCell(2);
XSSFCell cell3 = row.createCell(3);
//给单元格对象设值
cell0.setCellStyle(cellStyle);//设置样式给cell0 这个单元格
cell0.setCellValue(1111);
cell1.setCellStyle(cellStyle); //cell1 设置样式
cell1.setCellValue("张三"); //cell1 cell2 合并,因此只会显示前面的值,即:cell1的值--张三 ,cell2的值 不会展示
cell2.setCellValue("男");
cell3.setCellValue("西双版纳");
try {
//创建一个文件输出流,参数是:Excel文件的输出地址
FileOutputStream fos = new FileOutputStream("D:" + File.separator + "upload" + File.separator + "test.xlsx");
workbook.write(fos);//对象写入流中
fos.close();//关闭流
workbook.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("转化成功");
}
}
结果如下:
首先
总结:
- Workbook—一个接口,对应Excel的工作簿
- Workbook有如下HSSFWorkbook(操作xls文件)、XSSFWorkbook(操作xlsx文件)、SXSSFWorkbook(操作xlsx,是XSSFWorkbook的增强版)等实现类
- Sheet代表工作表,一个工作簿有很多个工作表
- Row代表工作表中的一个行
- Cell代表单元格