一、官网 http://poi.apache.org/download.html 提供的POI相关jar包不适用于单工程,要配合maven使用
二、单工程要用到的包如下,各位可点击下载配合使用
POI用到的jar包
三、本文用到的是 HSSF的 xls格式的展示例子,XSSF是xlsx格式的,需要变更时变更下面代码中的workbook类型即可。
各类型优劣:
XLS的写入快,但大小有限制,最多只能写入65536行数据。默认每次处理100行数据,之前的数据会存入临时的xml文件。所以不易发生内存溢出错误。
XLSX的无限制,但写入相对慢,XLSX是直接在内存中进行写操作,因此内存不充裕的服务器会面临内存溢出问题。可通过SXSSFWorkbook对象的dispose()方法对非托管资源进行资源释放操作。
SXSSFWorkbook解决了写入大量数据内存和磁盘占用空间太大的问题,但就需要舍弃些效率实现了。
参考来源:浅谈POI-HSSF、XSSF 、 SXSSF
四、下面是POI读写栗子
POI读取EXCEL内容
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyExcelInput {
public static void main(String[] args) throws Exception {
String fileName = "i://test.xls";
readExcel(fileName);
}
public static void readExcel(String fileName) throws Exception {
// 读取文件
InputStream inputStream = new FileInputStream(fileName);
// 找到工作簿
Workbook workbook = new HSSFWorkbook(inputStream);//xls接收对象
// 找到对应的sheet
Sheet sheet = workbook.getSheetAt(0);//0表示第一个sheet
// 得到物理行数
int rowCount = sheet.getPhysicalNumberOfRows();
// 根据物理行数,读取每一格内容
for (int i = 0; i < rowCount; i++) {
// 读取每一行内容
Row rowData = sheet.getRow(i);
if (rowData != null) {
// 由物理列数,得到总共由几列
int cellCount = rowData.getPhysicalNumberOfCells();
for (int j = 0; j < cellCount; j++) {
//读取每一行每一列的值
Cell cell = rowData.getCell(j);
String cellValue = "";
if (cell != null) {
// 获取类型,根据类型获取对应的值
CellType cellType = cell.getCellType();
switch (cellType) {
// case HSSFCell.CELL_TYPE_BOOLEAN: //poi3.15开始已不能用
case STRING: //CellType.STRING
System.out.println("字符串类型");
cellValue = cell.getStringCellValue();
break;
case BOOLEAN:
System.out.println("布尔类型");
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case _NONE:
System.out.println("无数据null");
break;
case NUMERIC:
// 数值类型有两种 时间戳和数值
if (HSSFDateUtil.isCellDateFormatted(cell)) {
System.out.println("日期");
Date date = cell.getDateCellValue();
cellValue = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(date);
} else {
System.out.println("数值类型");
cell.setCellType(CellType.STRING);
cellValue = cell.toString();
}
break;
case ERROR:
System.out.println("数据类型错误");
break;
case BLANK:
System.out.println("无数据");
break;
case FORMULA:
System.out.println("公式类型数据");
// 得到单元格使用的公式
String cellFormula = cell.getCellFormula();
System.out.println("使用的公式是:" + cellFormula);
// 得到计算数据
double numericCellValue = cell.getNumericCellValue();
System.out.println("计算数据为:" + numericCellValue);
break;
}
}
System.out.println(cellValue);
}
System.out.println("第" + (i + 1) + "行" + "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
}
}
inputStream.close();
}
}
POI写入EXCEL
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class MyExcelOutput {
public static void main(String[] args) throws IOException {
//创建工作簿
// Workbook workbook = new HSSFWorkbook(); //XLS后缀对象,速度快,但最多只能写65536条数据
Workbook workbook =new XSSFWorkbook(); //xlsx后缀对象
// XSSF
//创建sheet
Sheet sheet = workbook.createSheet("sheet名");
// 创建行
Row row1 = sheet.createRow(0);//第一行
Row row2 = sheet.createRow(1);//第二行
// 设置单元格格式
CellStyle cellStyle = workbook.createCellStyle();//单元格格式只能通过工作簿对象进行操作
// 设置水平对齐的样式为居中对齐;
// cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//可能会因为POI版本问题导致报错
cellStyle.setAlignment(HorizontalAlignment.CENTER);//Horizontal Alignment 水平 对齐
//设置垂直对齐的样式为居中对齐;
// cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//同样会因为版本问题报错
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
//创建单元格
Cell rowcell1 = row1.createCell(0);//A1第一行创建第一个单元格,row1是第一行对象
rowcell1.setCellValue("姓名");//赋值
rowcell1.setCellStyle(cellStyle);//赋予样式
Cell rowcell2 = row1.createCell(1);//A2第一行创建第二个单元格
rowcell2.setCellValue("年龄");
rowcell2.setCellStyle(cellStyle);
Cell rowcell3 = row1.createCell(2);//A3
rowcell3.setCellValue("课程");
rowcell3.setCellStyle(cellStyle);
Cell row2Cell1=row2.createCell(0); //单元格2-1,row2是第二行对象
row2Cell1.setCellValue("小明");
row2Cell1.setCellStyle(cellStyle);
Cell row2Cell2=row2.createCell(1);//单元格2-2
row2Cell2.setCellValue(16);
row2Cell2.setCellStyle(cellStyle);
Cell row2Cell3=row2.createCell(2);//单元格2-3
row2Cell3.setCellValue("语文");
row2Cell3.setCellStyle(cellStyle);
Cell row2Cell4=row2.createCell(3);//单元格2-4
row2Cell4.setCellValue("数学");
row2Cell4.setCellStyle(cellStyle);
//合并单元格(起始行,结束行,起始列,结束列)
CellRangeAddress cellAddresses = new CellRangeAddress(0,0,2,3);
sheet.addMergedRegion(cellAddresses);//sheet对象操作单元格合并 Merged Region 合并 区域
//要注意的是如果是行与行的合并,必须对第一行中的单元格赋值
Cell row1to2Cell5=row1.createCell(4);
CellRangeAddress timeRegion=new CellRangeAddress(0,1,4,4);
sheet.addMergedRegion(timeRegion);
String dateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());
System.out.println(dateTime);
row1to2Cell5.setCellValue(dateTime);
row1to2Cell5.setCellStyle(cellStyle);
// PrintStream printStream = new PrintStream(new FileOutputStream("I:\TEST.xls"));
PrintStream printStream = new PrintStream(new FileOutputStream("I:\TEST.xlsX"));
workbook.write(printStream);
printStream.close();
((SXSSFWorkbook)workbook).dispose();//xlsx内存溢出解决方法
}
}



