Java POI读取Excel数据,将数据写入到Excel表格
1.准备
首先需要导入poi相应的jar包,包括:

下载地址:http://pan.baidu.com/s/1bpoxdz5
所需要的包的所在位置包括:


2.读取Excel数据代码
package Shape2MDB;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import Bean.Student;
public class ReadXMLXData {
public static void main(String[] args) {
String path = "D:\\1work\\XLSX\\Test.xlsx";
if (path.endsWith(".xls")) {
readExcel2003(path);
} else if (path.endsWith(".xlsx")) {
readExcel2007(path);
}
}
private static void readExcel2007(String path) {
File excelFile = null;// Excel文件对象
InputStream is = null;// 输入流对象
String cellStr = null;// 单元格,最终按字符串处理
List<Student> studentList = new ArrayList<Student>();// 返回封装数据的List
Student student = null;// 每一个学生信息对象
try {
excelFile = new File(path);
is = new FileInputStream(excelFile);// 获取文件输入流
XSSFWorkbook workbook2007 = new XSSFWorkbook(is);// 创建Excel2007文件对象
XSSFSheet sheet = workbook2007.getSheetAt(0);// 取出第一个工作表,索引为0
// 这里注意区分getLastRowNum()和getPhysicalNumberOfRows()的区别
System.out.println("sheet.getLastRowNum():" + sheet.getLastRowNum());
System.out.println("sheet.getPhysicalNumberOfRows():" + sheet.getPhysicalNumberOfRows());
// 开始循环遍历行,表头不处理,从1开始
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
student = new Student();// 实例化Student对象
XSSFRow row = sheet.getRow(i);// 获取行对象
if (row == null) {// 如果为空,不处理
continue;
}
// row如果不为空,循环遍历单元格
for (int j = 0; j < row.getLastCellNum(); j++) {
XSSFCell cell = row.getCell(j);// 获取单元格对象
if (cell == null) {// 单元格为空设置cellStr为空串
cellStr = "";
} else if (cell.getCellType() == XSSFCell.CELL_TYPE_BOOLEAN) {// 对布尔值的处理
cellStr = String.valueOf(cell.getBooleanCellValue());
} else if (cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {// 对数字值的处理
cellStr = cell.getNumericCellValue() + "";
} else {// 其余按照字符串处理
cellStr = cell.getStringCellValue();
}
// 下面按照数据出现位置封装到bean中
if (j == 0) {
student.setName(cellStr);
} else if (j == 1) {
student.setGender(cellStr);
} else if (j == 2) {
student.setAge(new Double(cellStr).intValue());
} else if (j == 3) {
student.setSclass(cellStr);
} else {
student.setScore(new Double(cellStr).intValue());
}
}
studentList.add(student);// 数据装入List
}
System.out.println(studentList);
} catch (Exception e) {
e.printStackTrace();
} finally {// 关闭文件流
try {
if (is != null) {
is.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
private static void readExcel2003(String path) {
File excelFile = null;// Excel文件对象
InputStream is = null;// 输入流对象
String cellStr = null;// 单元格,最终按字符串处理
List<Student> studentList = new ArrayList<Student>();// 返回封装数据的List
Student student = null;// 每个学生信息对象
try {
excelFile = new File(path);
is = new FileInputStream(excelFile);// 获取文件输入流
HSSFWorkbook workbook2003 = new HSSFWorkbook(is);// 创建Excel2003文件对象
HSSFSheet sheet = workbook2003.getSheetAt(0);// 取出第一个工作表,索引是0
// 这里注意区分getLastRowNum()和getPhysicalNumberOfRows()的区别
System.out.println("sheet.getLastRowNum():" + sheet.getLastRowNum());
System.out.println("sheet.getPhysicalNumberOfRows():" + sheet.getPhysicalNumberOfRows());
// 开始循环遍历行,表头不处理,从1开始
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
student = new Student();// 实例化Student对象
HSSFRow row = sheet.getRow(i);// 获取行对象
if (row == null) {// 如果为空,不处理
continue;
}
// 如果row不为空,循环遍历单元格
System.out.println("row.getLastCellNum:" + row.getLastCellNum());
for (int j = 0; j < row.getLastCellNum(); j++) {
HSSFCell cell = row.getCell(j);// 获取单元格对象
if (cell == null) {// 如果为空,设置cellStr为空串
cellStr = "";
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {// 对布尔值的处理
cellStr = String.valueOf(cell.getBooleanCellValue());
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {// 对数字值的处理
cellStr = cell.getNumericCellValue() + "";
} else {// 其余按照字符串处理
cellStr = cell.getStringCellValue();
}
// 下面按照数据出现的位置封装到bena中
if (j == 0) {
student.setName(cellStr);
} else if (j == 1) {
student.setGender(cellStr);
} else if (j == 2) {
student.setAge(new Double(cellStr).intValue());
} else if (j == 3) {
student.setSclass(cellStr);
} else {
student.setScore(new Double(cellStr).intValue());
}
}
studentList.add(student);// 数据装入List
}
System.out.println(studentList);
} catch (Exception e) {
e.printStackTrace();
} finally {// 关闭文件流
if (is != null) {
try {
is.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
}
3.将数据写入到Excel表格代码
package Shape2MDB;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import Bean.Student;
public class OutputXMLSData {
public static void main(String[] args) {
//测试数据
List<Student> list = new ArrayList<Student>();
Student s1 = new Student("1", "1", 1, "1", 1);
list.add(s1);
Student s2 = new Student("1", "1", 1, "1", 1);
list.add(s2);
Student s3 = new Student("1", "1", 1, "1", 1);
list.add(s3);
Student s4 = new Student("1", "1", 1, "1", 1);
list.add(s4);
Student s5 = new Student("1", "1", 1, "1", 1);
list.add(s5);
Student s6 = new Student("1", "1", 1, "1", 1);
list.add(s6);
outPutData(list);
}
private static void outPutData(List<Student> list) {
// 第一步,创建一个webbook,对应一个Excel文件
HSSFWorkbook wb = new HSSFWorkbook();
// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet sheet = wb.createSheet("学生表一");
// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
HSSFRow row = sheet.createRow((int) 0);
// 第四步,创建单元格,并设置值表头 设置表头居中
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
HSSFCell cell = row.createCell((short) 0);
cell.setCellValue("name");
cell.setCellStyle(style);
cell = row.createCell((short) 1);
cell.setCellValue("gerder");
cell.setCellStyle(style);
cell = row.createCell((short) 2);
cell.setCellValue("age");
cell.setCellStyle(style);
cell = row.createCell((short) 3);
cell.setCellValue("class");
cell.setCellStyle(style);
cell = row.createCell((short) 4);
cell.setCellValue("score");
cell.setCellStyle(style);
// 第五步,写入实体数据 实际应用中这些数据从数据库得到,
for (int i = 0; i < list.size(); i++) {
row = sheet.createRow((int) i + 1);
Student stu = (Student) list.get(i);
// 第四步,创建单元格,并设置值
row.createCell((short) 0).setCellValue(stu.getName());
row.createCell((short) 1).setCellValue(stu.getGender());
row.createCell((short) 2).setCellValue((double) stu.getAge());
row.createCell((short) 3).setCellValue(stu.getSclass());
row.createCell((short) 2).setCellValue((double) stu.getScore());
}
// 第六步,将文件存到指定位置
try {
FileOutputStream fout = new FileOutputStream("C:/students.xls");
wb.write(fout);
fout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.异常处理
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlException
at Shape2MDB.ReadXMLXData.readExcel2007(ReadXMLXData.java:39)
at Shape2MDB.ReadXMLXData.main(ReadXMLXData.java:26)
Caused by: java.lang.ClassNotFoundException: org.apache.xmlbeans.XmlException
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 2 more
使用POI操作Excel,电脑上面装的office2007,一直报如下错误,第一个是反射有关的,第二个是没找到对应的类,确实在POI的几个包中也没有找到该类,但是我直接引入该类编译器又没报错……最后发现把Excel另存为2003的格式是就正确了。到网上查了下,在操作office2007还要加入一个包
xbean.jar 官网:http://xmlbeans.apache.org
本文也提供网盘下载地址:http://pan.baidu.com/s/1bQI3jK
4.POI报表的一些常用函数
摘自:http://blog.csdn.net/tolcf/article/details/48346697
(1)建立sheet:
1.HSSFSheet sheet = workbook.createSheet("sheet1");//新建sheet页
(2)兴建单元格:
2.HSSFCellStyle cellStyle = wb.createCellStyle(); //新建单元格样式
(3) 设置背景颜色:
- cellStyle.setFillForegroundColor((short) 13);// 设置背景色
- cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
(4)设置边框:
- cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
- cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
- cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
- cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
(5)设置居中:cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
(6)设置字体:
- HSSFFont font2 = wb.createFont();
- font2.setFontName("仿宋_GB2312");
- font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示
- font2.setFontHeightInPoints((short) 12); //字体大小
- cellStyle.setFont(font);//选择需要用到的字体格式
(7)设置列宽
- sheet.setColumnWidth(0, 3766);
- //第一个参数代表列id(从0开始),第2个参数代表宽度值 参考 :"2012-08-10"的宽度为2500
(8)设置自动换行
- cellStyle.setWrapText(true);//设置自动换行
(9)合并单元格
- //参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号
- Region region1 = new Region(0, (short) 0, 0, (short) 6);//合并第(0,0)单元格到第(0,6)单元格
- sheet.addMergedRegion(region1);
- //此方法在POI3.8中已经被废弃,建议使用下面一个
- //或者用
- CellRangeAddress region1 = new CellRangeAddress(rowNumber, rowNumber, (short) 0, (short) 11); //参数1:起始行 参数2:终止行 参数3:起始列 参数4:终止列
- sheet.addMergedRegion(region1);
- //但应注意两个构造方法的参数不是一样的,具体使用哪个取决于POI的不同版本。
Java POI读取Excel数据,将数据写入到Excel表格的更多相关文章
- 分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要)
原文:分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要) Java InputStream读取数据问题 ======== ...
- Java poi读取,写入Excel2003
Java poi读取,写入Excel2003 相关阅读:poi读写Excel2007:http://www.cnblogs.com/gavinYang/p/3576741.htmljxl读写excel ...
- Java poi读取,写入Excel2007
Java poi读取,写入Excel2007 相关阅读:poi读写Excel2003:http://www.cnblogs.com/gavinYang/p/3576739.htmljxl读写excel ...
- poi 读取使用 Strict Open XML 保存的 excel 文档
poi 读取使用 Strict Open XML 保存的 excel 文档 某项目有一个功能需要读取 excel 报表内容,使用poi读取时报错: 具体错误为: org.apache.poi.POIX ...
- Java——poi读取Excel文件
1.创建文件流,打开EXCEL文件 FileInputStream excelFile = new FileInputStream(excelPath); XSSFWorkbook workbook ...
- JAVA用POI读取和创建2003和2007版本Excel完美示例
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- JAVA用POI读取和创建2003和2007版本Excel
1.添加maven依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-o ...
- java POI读取excel 2007/2003
2003版office excel读取 import java.io.FileNotFoundException; import java.io.IOException; import java.io ...
- Java InputStream读取网络响应Response数据的方法
Java InputStream读取数据问题 原理讲解 1. 关于InputStream.read() 在从数据流里读取数据时,为图简单,经常用InputStream.read()方法.这个方 ...
随机推荐
- flask开发框架
# -*- coding: utf-8 -*- # import fcrm from fcrm import app if __name__ == '__main__': # fcrm.app.run ...
- Mybatis之基于XML的增删改查
这里先吐槽下,写的半天的东西,IE浏览器弹出调试窗口导致写的东西全部没保存,搞得我还要重新用谷歌写,思路全没了,fuck. 前面学习了下spring的DAO层,说起DAO层,那ORM肯定是少不了的,O ...
- python 序列话模块 常用
什么是序列化? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flatte ...
- 【JavaScript_DOM 淘宝购物车】
让我们一起看一下淘宝的购物车是怎么做的吧,刚刚入门的我可能很多地方的用法都不够优化,不过个人感觉先把逻辑清晰之后再做的话其实也并不难哦, 以下是我做的页面代码: HTML代码: <!DOCTYP ...
- CTF---密码学入门第二题 我喜欢培根
我喜欢培根分值:20 来源: Ph0enix 难度:中 参与人数:3449人 Get Flag:1410人 答题人数:1653人 解题通过率:85% key: CTF{} 解题链接: http://c ...
- 【Java学习笔记之二十】final关键字在Java继承中的用法小结
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. ...
- 2017ccpc哈尔滨区域赛H
n堆石子 每次只能拿一个石子从一堆移到另一堆 知道所有的堆的石子数目都能整除x(x>1) 问最小移动次数 枚举x的可能取值 即a[i]和的素因子即可 合因子的区间变化会比较大 然后求余 ...
- NYoj_171聪明的kk
聪明的kk 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 聪明的"KK" 非洲某国展馆的设计灵感源于富有传奇色彩的沙漠中陡然起伏的沙丘,体现出本国不 ...
- DFS(dfs)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2212 DFS Time Limit: 5000/2000 MS (Java/Others) Me ...
- CSS鼠标样式 cursor 属性
值 描述 url 需使用的自定义光标的 URL. 注释:请在此列表的末端始终定义一种普通的光标,以防没有由 URL 定义的可用光标. default 默认光标(通常是一个箭头) auto 默认.浏览器 ...