java如何读取excel文件中的数据_Java读取、写入、处理Excel文件中的数据(转载)

本文详细介绍了Java使用jxl库读取、写入和格式化Excel数据的方法。通过示例代码展示了如何读取Excel文件中的数据,将数据写入新的Excel文件,以及如何设置单元格的格式。文章还提供了扩展示例,包括读取目录下所有Excel文件并写入到不同txt文件,以及如何修改Excel中的数据和格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在日常工作中,我们常常会进行文件读写操作,除去我们最常用的纯文本文件读写,更多时候我们需要对Excel中的数据进行读取操作,本文将介绍Excel读写的常用方法,希望对大家学习Java读写Excel会有帮助。

在开始进行Java读写Excel前,我们需要先下一个jxl的jar包,这个jar包中提供了相关读写Excel的方法,在百度里所搜一下jxl.jar下载就会出现很多下载地址了,这里不再累述。随后我们将jxl.jar放到classpath下或者在工程的buildpath中添加jxl.jar后,便可以开始Java读写Excel的神秘之旅了。

第一章

Java读取Excel数据

首先,创建一个xls文件(如:jxltest.xls),然后在文件中添加一些数据,Excel文件创建完成后,我们便可以开始写代码读取了:

代码如下:

package jxl.zhanhj;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import jxl.Sheet;

import jxl.Workbook;

import jxl.read.biff.BiffException;

public class GetExcelInfo {

public static void main(String[] args) {

GetExcelInfo obj = new GetExcelInfo();

// 此处为我创建Excel路径:E:/zhanhj/studysrc/jxl下

File file = new File("E:/zhanhj/studysrc/jxl/getExcleinfo.xls");

obj.readExcel(file);

}

// 去读Excel的方法readExcel,该方法的入口参数为一个File对象

public void readExcel(File file) {

try {

// 创建输入流,读取Excel

InputStream is = new FileInputStream(file.getAbsolutePath());

// jxl提供的Workbook类

Workbook wb = Workbook.getWorkbook(is);

// Excel的页签数量

int sheet_size = wb.getNumberOfSheets();

for (int index = 0; index < sheet_size; index++) {

// 每个页签创建一个Sheet对象

Sheet sheet = wb.getSheet(index);

// sheet.getRows()返回该页的总行数

for (int i = 0; i < sheet.getRows(); i++) {

// sheet.getColumns()返回该页的总列数

for (int j = 0; j < sheet.getColumns(); j++) {

String cellinfo = sheet.getCell(j, i).getContents();

System.out.println(cellinfo);

}

}

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (BiffException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

package com.test;

import jxl.*;

import jxl.read.biff.BiffException;

import java.io.*;

public class ReadExcel {

public static void main(String[] args) throws BiffException, IOException {

Workbook book = Workbook.getWorkbook(new File("Test.xls"));

//获得第一个工作表对象

Sheet sheet = book.getSheet("sheet_one");

//Sheet sheet = book.getSheet(0);

int rows = sheet.getRows();

int cols = sheet.getColumns();

System.out.println("总列数:" + cols);

System.out.println("总行数:" + rows);

System.out.println("----------------------------");

int i=0;

int j=0;

//循环读取数据

for(i=0;i

{

for(j=0;j

{

System.out.println("第"+j+"行,第"+i+"列为:"+sheet.getCell(i, j).getContents());

}

}

}

}

上面这个例子是一个很简单读取Excel并将各单元格的数据打印到控制台上,更多Excel操作方法,请参加jxl API。

下面我们再对上面的例子进行一个小小的扩展:

1、读取一个目录下的所有Excel文件

2、读取的每个Excel文件的数据写入到不同的txt中

代码如下:

package jxl.zhanhj;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStream;

import java.io.PrintWriter;

import jxl.Sheet;

import jxl.Workbook;

import jxl.read.biff.BiffException;

public class GetExcelInfo {

public static void main(String[] args) {

GetExcelInfo obj = new GetExcelInfo();

// 此处路径指定到目录而不是单个文件

File file = new File("E:/zhanhj/studysrc/jxl");

if (file.isDirectory()) {

File[] files = file.listFiles();

for (File f : files)

// 如果还存在子目录则继续读取子目录下的Excel文件

if (f.isDirectory()) {

File[] subfiles = f.listFiles();

for (File fi : subfiles) {

// 对文件进行过滤,只读取Excel文件,非Excel文件不读取,否则会出错

if (fi.getName().indexOf(".xls") > 0) {

obj.readExcelWrite2TXT(fi);

}

}

} else {

// 对文件进行过滤,只读取Excel文件,非Excel文件不读取,否则会出错

if (f.getName().indexOf(".xls") > 0) {

obj.readExcelWrite2TXT(f);

}

}

}

}

// 去读Excel的方法readExcel,该方法的入口参数为一个File对象

public void readExcelWrite2TXT(File file) {

// 创建文件输出流

FileWriter fw = null;

PrintWriter out = null;

try {

// 指定生成txt的文件路径

String fileName = file.getName().replace(".xls", "");

fw = new FileWriter(file.getParent() + "/" + fileName + ".txt");

out = new PrintWriter(fw);

// 创建输入流,读取Excel

InputStream is = new FileInputStream(file.getAbsolutePath());

// jxl提供的Workbook类

Workbook wb = Workbook.getWorkbook(is);

// Excel的页签数量

int sheet_size = wb.getNumberOfSheets();

for (int index = 0; index < sheet_size; index++) {

// 每个页签创建一个Sheet对象

Sheet sheet = wb.getSheet(index);

// sheet.getRows()返回该页的总行数

for (int i = 0; i < sheet.getRows(); i++) {

// sheet.getColumns()返回该页的总列数

for (int j = 0; j < sheet.getColumns(); j++) {

String cellinfo = sheet.getCell(j, i).getContents();

// 将从Excel中读取的数据写入到txt中

out.println(cellinfo);

}

}

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (BiffException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

// 记得关闭流

out.close();

fw.close();

// 由于此处用到了缓冲流,如果数据量过大,不进行flush操作,某些数据将依旧

// 存在于内从中而不会写入文件,此问题一定要注意

out.flush();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

下面我们来一起对Java读取Excel流程做一个总结:

1、打开工作文件Workbook,在此之前先用java的io流创建或者读取文件

2、打开工作表Sheet

3、读行,然后读列(行和列是从0开始的)

4、进行数据进行操作

第二章

接着上一节的内容,本节主要讲述如何通过Java程序向Excel文件中写数据,包括:1、数据类型的控制;2、单元格及数据的格式化。

要快速上手,我们还是通过阅读代码来学习,这样可以帮助大家建立一个更直观的概念和认识。

创建新文件

package com.test;

import jxl.*;

import java.io.*;

import jxl.write.*;

import jxl.write.biff.RowsExceededException;

public class CreateExcel {

public static void main(String[] args) throws RowsExceededException, WriteException{

WritableWorkbook book;

try {

System.out.println("---start---");

//打开文件

book = Workbook.createWorkbook(new File("Test.xls"));

//生成名为“第一页”的工作表,参数0表示这是第一页

WritableSheet sheet = book.createSheet("sheet_one", 0);

//在Label对象的构造中指名单元格位置是第一列第一行(0,0)

//以及单元格内容为Hello World

Label label = new Label(0,0,"Hello World");

//将定义好的单元格添加到工作表中

sheet.addCell(label);

/*生成一个保存数字的单元格

必须使用Number的完整包路径,否则有语法歧义

单元格位置是第二列,第一行,值为789.123*/

jxl.write.Number num = new jxl.write.Number(0,1,123.456);

sheet.addCell(num);

//写入数据并关闭文件

book.write();

book.close();

System.out.println("---end---");

} catch (IOException e) {

System.out.println(e);

}

}

}

1、写入Excel及数据类型控制

程序描述:通过Java程序新建一个名为test.xls的文件,并在Excel的第一行第一列写一个字符串,在第一行第二列写一个数字,在第一行第三列写一个日期。

package jxl.zhanhj;

import java.io.File;

import java.util.Date;

import jxl.Workbook;

import jxl.write.Label;

import jxl.write.WritableSheet;

import jxl.write.WritableWorkbook;

import jxl.write.Number;

import jxl.write.DateTime;

public class CreateExcel {

public static void main(String args[]) {

try {

// 打开文件

WritableWorkbook book = Workbook.createWorkbook(new File(

"test.xls"));

// 生成名为“sheet1”的工作表,参数0表示这是第一页

WritableSheet sheet = book.createSheet("sheet1", 0);

// 在Label对象的构造子中指名单元格位置是第一列第一行(0,0),单元格内容为string

Label label = new Label(0, 0, "string");

// 将定义好的单元格添加到工作表中

sheet.addCell(label);

// 生成一个保存数字的单元格,单元格位置是第二列,第一行,单元格的内容为1234.5

Number number = new Number(1, 0, 1234.5);

sheet.addCell(number);

// 生成一个保存日期的单元格,单元格位置是第三列,第一行,单元格的内容为当前日期

DateTime dtime = new DateTime(2, 0, new Date());

sheet.addCell(dtime);

// 写入数据并关闭文件

book.write();

book.close();

} catch (Exception e) {

System.out.println(e);

}

}

}

几个重要对象解析:

1、WritableWorkbook:用于创建打开Excel文件

2、WritableSheet:用于创建Excel中的页签

3、Label:将单元格指定为文本型,并写入字符串

4、Number:将单元格指定为数字型,并可写入数字

5、DateTime:将单元格指定为日期型,并可写入日期

掌握这几个类及其方法后,我们便可以方便的向Excel进行写入操作了,更多对象请参见jxl api。

2、写入时单元格及数据的格式化

程序描述:在数据写入到单元格后,对数据进行格式化,包括字体大小、颜色等

package jxl.zhanhj;

import java.io.File;

import java.util.Date;

import jxl.CellType;

import jxl.Workbook;

import jxl.format.Border;

import jxl.format.BorderLineStyle;

import jxl.format.Colour;

import jxl.format.VerticalAlignment;

import jxl.format.Alignment;

import jxl.write.DateFormat;

import jxl.write.Label;

import jxl.write.NumberFormat;

import jxl.write.WritableCellFormat;

import jxl.write.WritableFont;

import jxl.write.WritableSheet;

import jxl.write.WritableWorkbook;

import jxl.write.Number;

import jxl.write.DateTime;

import jxl.write.WriteException;

public class CreateExcel {

public static void main(String args[]) {

try {

// 打开文件

WritableWorkbook book = Workbook

.createWorkbook(new File("test.xls"));

// 生成名为“sheet1”的工作表,参数0表示这是第一页

WritableSheet sheet = book.createSheet("sheet1", 0);

// 在Label对象的构造子中指名单元格位置是第一列第一行(0,0),单元格内容为string

Label label = new Label(0, 0, "string",

getDataCellFormat(CellType.LABEL));

// 将定义好的单元格添加到工作表中

sheet.addCell(label);

// 生成一个保存数字的单元格,单元格位置是第二列,第一行,单元格的内容为1234.5

Number number = new Number(1, 0, 1234.5,

getDataCellFormat(CellType.NUMBER));

sheet.addCell(number);

// 生成一个保存日期的单元格,单元格位置是第三列,第一行,单元格的内容为当前日期

DateTime dtime = new DateTime(2, 0, new Date(),

getDataCellFormat(CellType.DATE));

sheet.addCell(dtime);

// 写入数据并关闭文件

book.write();

book.close();

} catch (Exception e) {

System.out.println(e);

}

}

public static WritableCellFormat getDataCellFormat(CellType type) {

WritableCellFormat wcf = null;

try {

// 字体样式

if (type == CellType.NUMBER || type == CellType.NUMBER_FORMULA) {// 数字

NumberFormat nf = new NumberFormat("#.00");

wcf = new WritableCellFormat(nf);

} else if (type == CellType.DATE) {// 日期

DateFormat df = new DateFormat("yyyy-MM-dd hh:mm:ss");

wcf = new WritableCellFormat(df);

} else {

WritableFont wf = new WritableFont(WritableFont.TIMES, 10,

WritableFont.NO_BOLD, false);

// 字体颜色

wf.setColour(Colour.RED);

wcf = new WritableCellFormat(wf);

}

// 对齐方式

wcf.setAlignment(Alignment.CENTRE);

wcf.setVerticalAlignment(VerticalAlignment.CENTRE);

// 设置上边框

wcf.setBorder(Border.TOP, BorderLineStyle.THIN);

// 设置下边框

wcf.setBorder(Border.BOTTOM, BorderLineStyle.THIN);

// 设置左边框

wcf.setBorder(Border.LEFT, BorderLineStyle.THIN);

// 设置右边框

wcf.setBorder(Border.RIGHT, BorderLineStyle.THIN);

// 设置背景色

wcf.setBackground(Colour.YELLOW);

// 自动换行

wcf.setWrap(true);

} catch (WriteException e) {

e.printStackTrace();

}

return wcf;

}

}

几个重要对象解析:

1、WritableCellFormat:用于格式化单元格

2、WritableFont:用于格式化字体

更多请参加jxl api。

到这里本节的讲解就结束了,下面我们可以总结出Excel的写入流程:

1、用WritableWorkbook创建Excel文件

2、用WritableSheet创建页签

3、用Label、Number、DateTime等创建单元格内容

4、在创建单元格内容时,我们可以给写一个格式化方法,对单元格内容进行格式化

5、格式化主要包括2类:单元格格式化(WritableCellFormat)、值的格式化(WritableFont)

继前两节的Java读取、写入Excel后,本期将推出Java修改Excel中数据以及格式的方法和技巧,如果大家学习了前面的读、写Excel,相信学习本节内容将是不费吹灰之力啊,不过要灵活的运用还需多加努力呀。

package jxl.zhanhj;

import java.io.*;

import java.util.HashMap;

import jxl.*;

import jxl.format.Alignment;

import jxl.format.Border;

import jxl.format.BorderLineStyle;

import jxl.format.Colour;

import jxl.format.VerticalAlignment;

import jxl.write.Label;

import jxl.write.WritableCellFormat;

import jxl.write.WritableFont;

import jxl.write.WritableSheet;

import jxl.write.WritableWorkbook;

import jxl.write.WriteException;

public class UpdateExcel {

public static void main(String args[]) {

WritableWorkbook book = null;

HashMap map = new HashMap();

map = getPCKV();

try {

// Excel获得文件

Workbook wb = Workbook.getWorkbook(new File("update_test.xls"));

// 打开一个文件的副本,并且指定数据写回到原文件

book = Workbook.createWorkbook(new File("update_test.xls"), wb);

Sheet sheet = book.getSheet(0);

WritableSheet wsheet = book.getSheet(0);

int colunms = sheet.getColumns();

// 不读表头

for (int i = 1; i < sheet.getRows(); i++) {

StringBuffer pcin = new StringBuffer();

// 将省市组合起来与HashMap进行匹配

String province = sheet.getCell(4, i).getContents().trim();

String city = sheet.getCell(5, i).getContents().trim();

pcin = pcin.append(province).append("-").append(city);

// 如果不匹配,则在该行的最后加入标注信息

if (!map.containsValue(pcin.toString())) {

Label label = new Label(colunms, i, "省市选择出错",

getDataCellFormat());

wsheet.addCell(label);

}

}

book.write();

} catch (Exception e) {

System.out.println(e);

} finally {

try {

book.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

// 设置标注的格式为黄底红字

public static WritableCellFormat getDataCellFormat() {

WritableCellFormat wcf = null;

try {

WritableFont wf = new WritableFont(WritableFont.TIMES, 10,

WritableFont.BOLD, false);

// 字体颜色

wf.setColour(Colour.RED);

wcf = new WritableCellFormat(wf);

// 对齐方式

wcf.setAlignment(Alignment.CENTRE);

wcf.setVerticalAlignment(VerticalAlignment.CENTRE);

// 设置上边框

wcf.setBorder(Border.TOP, BorderLineStyle.THIN);

// 设置下边框

wcf.setBorder(Border.BOTTOM, BorderLineStyle.THIN);

// 设置左边框

wcf.setBorder(Border.LEFT, BorderLineStyle.THIN);

// 设置右边框

wcf.setBorder(Border.RIGHT, BorderLineStyle.THIN);

// 设置背景色

wcf.setBackground(Colour.YELLOW);

// 自动换行

wcf.setWrap(true);

} catch (WriteException e) {

e.printStackTrace();

}

return wcf;

}

// 省市对应关系Map

public static HashMap getPCKV() {

HashMap map = new HashMap();

map.put("01", "河北省-石家庄");

map.put("02", "河北省-秦皇岛");

map.put("03", "河北省-唐山");

map.put("04", "四川省-成都");

map.put("05", "四川省-绵阳");

map.put("06", "四川省-达州");

map.put("07", "广西省-桂林");

map.put("08", "广西省-南宁");

map.put("09", "广西省-柳州");

return map;

}

}

到这里,Java修改Excel单元格的数据及格式便告一段落了,本节给出了一个较为简单的场景进行了讲述,目的在于引导大家学习Java修改Excel的常用流程和方法,若读者能将Java操作Excel学得更深,往往可以发挥更大的作用。比如程序中利用HashMap来存储对应关系,如果要将全国的省市纳入进来,利用HashMap不是很好的做好,我们可以改成通过利用数据库来达到同样的效果,这里的改进留给读者。

读到这里,可能有部分读者会产生疑问,这种操作,直接在Excel中,我们不是也可以操作吗?为什么通过Java来修改,是不是多此一举了?其实不然,如果读者将Java读写文件结合起来,以及在将此程序稍微扩展一下,对每个Excel的所有页签进行遍历,那么Java程序处理的数据里和复杂度,远远不是单纯的Excel能企及的。举个简单的场景(仅仅将上述场景进行扩展):

第三章

向已有的Excel中添加WorkSheet

package com.test;

import jxl.*;

import java.io.*;

import jxl.read.biff.BiffException;

import jxl.write.*;

import jxl.write.biff.RowsExceededException;

public class UpdateExcel {

public static void main(String[] args) throws BiffException, IOException, RowsExceededException, WriteException{

//获得文件

Workbook wb = Workbook.getWorkbook(new File ("Test.xls"));

//打开一个文件的副本,并且指定数据写回到原文件

WritableWorkbook book = Workbook.createWorkbook(new File ("Test.xls"), wb);

//添加一个工作表

WritableSheet sheet = book.createSheet("sheet_two", 1);

sheet.addCell(new Label(0,0,"Test data for sheet_two"));

//输出

System.out.println(sheet.getCell(0, 0).getContents());

book.write();

book.close();

}

}

使用XSSFWorkbook读取EXCEL文件

导入jar包,jar包地址 https://pan.baidu.com/s/1gHaIGyFjQL6mqiWHXtdD4w

da0ead70f44c90d76d2ddc9ff89af26f.png

代码如下

package com.zk.test;

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 java.io.FileInputStream;

import java.io.IOException;

public class TestStream {

public static void main(String[] args){

try {

//创建工作簿

XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream("D:\\excel.xlsx"));

//System.out.println("xssfWorkbook对象:" + xssfWorkbook);

//读取第一个工作表

XSSFSheet sheet = xssfWorkbook.getSheetAt(0);

System.out.println("var member=[");

//System.out.println("sheet对象:" + sheet);

//获取最后一行的num,即总行数。此处从0开始计数

int maxRow = sheet.getLastRowNum();

//System.out.println("总行数为:" + (maxRow+1));

for (int row = 1; row <= maxRow; row++) {

//获取最后单元格num,即总单元格数 ***注意:此处从1开始计数***

System.out.println("{");

int maxRol = sheet.getRow(row).getLastCellNum();

//System.out.println("--------第" + row + "行的数据如下--------");

System.out.println("phone:\""+sheet.getRow(row).getCell(1) + "\",");

System.out.println("name:\""+sheet.getRow(row).getCell(0)+"\",");

if(row!=maxRow) {

System.out.println("},");

}else {

System.out.println("}");

}

}

System.out.println("]");

} catch (IOException e) {

e.printStackTrace();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值