分享
 
 
 

使用java操作Excel文件

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

1. 必要性

Excel是一种常见的文档格式,通常情况下大多数的客户都对使用Excel十分的精通。对于我们来说,客户善于使用就可以使我们免于培训的烦恼。而某些系统往往需要录入相当量的数据,这些数据一般以某种特定的格式保存。而Excel正是一种相当规格的数据保存方式,至少它是易于格式化的,而且客户也能够按照某种特定的格式来将数据录入到Excel文件中去。所以综上,我们有必要了解如何用纯java来读取Excel文件。

2. 目的

我们希望用户将资料录入Excel的目的往往只有一个就是将这些数据导入到数据库中去。数据库往往比较复杂,而且各种不同的数据库产品之间是不同的,这种区别无疑的增加了我们导入的困难。从excel文件来说,用户录入的数据往往并不能直接使用,要经过逻辑处理或者出错的判断,或者默认的改正等。如果能够使用java来直接读取excel文件,无疑会使我们能够较从容的解决这些问题。

3. 其他的方法

将数据从excel文件中读出来还有一个方法,就是使用odbc。然后再用jdbc-odbc桥来将数据从excel文件中读出到java中来,不过这种方法必须配odbc,针对excle文件配odbc是一件很麻烦的事情,而且难以操控,所以这只能是一种暂时的解决方法。

4. POI

POI是Apache的Jakata项目,POI 代表 Poor Obfuscation Implementation,即不良模糊化实现。POI 的目标就是提供一组 Java API 来使得基于 Microsoft OLE 2 Compound Document 格式的 Microsoft Office 文件易于操作。一些 POI API 仅仅是为最常用的 Microsoft Office 文件 Word 和 Excel 而开发的;而其他的 API 则是用于通用的 OLE 2 Compound Document 和属性文件。POI可以到www.apache.org下载到。编译好的jar主要有这样4个:poi包,poi Browser包,poi hdf包,poi hssf例程包。实际运行时,需要有poi包就可以了。POI 是一个开放源代码项目,并且得到了数百名志愿者的不断更新。可以在 http://jakarta.apache.org/builds/jakarta-poi/ 上获得源代码和文档。通过POI包,我们不仅可以操纵excel文档,也能够操控word文档,以及其他的OLE2格式的文档。

5. HSSF

HSSF 代表 Horrible Spreadsheet Format(可怕的电子表格格式)。API 给程序员提供了极其容易地读写或操作 Microsoft Excel 97-2002 文件的能力。这些API都由POI包来提供,实际使用是我们只需要POI包就可以了。

6. 操作EXCEL文件

HSSF提供给用户使用的对象在org.apache.poi.hssf.usermodel包中,主要部分包括Excell对象,样式和格式,还有辅助操作。有以下几种对象:

HSSFWorkbook excell的文档对象

HSSFSheet excell的表单

HSSFRow excell的行

HSSFCell excell的格子单元

HSSFFont excell字体

HSSFName 名称

HSSFDataFormat 日期格式

在poi1.7中才有以下2项:

HSSFHeader sheet头

HSSFFooter sheet尾

和这个样式

HSSFCellStyle cell样式

辅助操作包括

HSSFDateUtil 日期

HSSFPrintSetup 打印

HSSFErrorConstants 错误信息表

我们经常能够使用到的还是读取EXCEL文件,下面看一个例子:

POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("workbook.xls"));

HSSFWorkbook wb = new HSSFWorkbook(fs);

HSSFSheet sheet = wb.getSheetAt(0);

HSSFRow row = sheet.getRow(2);

HSSFCell cell = row.getCell((short)3);

if (cell == null)

{

cell = row.createCell((short)3);

}

cell.setCellType(HSSFCell.CELL_TYPE_STRING);

cell.setCellValue("a test"); // Write the output to a file

FileOutputStream fileOut = new FileOutputStream("workbook.xls");

wb.write(fileOut);

fileOut.close();

这是基本的读写方法,其中我们注意到HSSF中几个关键对象的使用。其中HSSFWorkbook代表的是整个文档,这个workbook的概念是excel本身的概念,如果你不清楚,就去查excel的帮助文档。HSSFSheet代表的是具体的表格,在excel中一份workbook中可能会有好几个表格,这些表格的顺序是从0开始的。“HSSFSheet sheet = wb.getSheetAt(0);”这一条语句就是建立表格对象即Sheet对象。Sheet对象建立之后就可以读Cell了,即表格的内容。

通过POI来读取EXCEL文件就是这么简单。

7. 一个例子

这个例子是基于GUI的,功能是读入一个excel文件并输出成html或者文本文件(需要你自己选择)。并能够生成insert语句。要使用POI包。

package testxls;

import java.io.*;

import javax.swing.*;

import javax.swing.filechooser.FileFilter;

import org.apache.poi.hssf.usermodel.*;

import org.apache.poi.poifs.filesystem.*;

/**

* <p>Title: 取得xls电子表格内容</p>

* <p>Description: 这个类的作用是从微软的电子表格中读取信息,

* 目前支持Excel97,Excel2000。使用apache的poi包。</p>

* <p>Copyright: Copyright (c) 2003</p>

* <p>Company: </p>

* jakelong@163.com

* @version 1.0

*/

public class testxls

{

File testfile = null;

private HSSFSheet sheet;

String Field = "";

String tbName="";

//--------------------------------------------------------

public testxls()

{

}

//-------------------------------------------

public File filechooer()

{ //文件选择器

JFileChooser chooser = new JFileChooser();

XlsFileFiliter filter1 = new XlsFileFiliter();

chooser.addChoosableFileFilter(filter1);

chooser.setAcceptAllFileFilterUsed(false);

int result = chooser.showOpenDialog(chooser);

testfile = chooser.getSelectedFile();

if (result == chooser.CANCEL_OPTION)

System.exit(0);

return testfile;

}

//---------------------------------------------------

public HSSFSheet getSheet(File f)

{ //得到一个sheet对象。

HSSFWorkbook wb = null;

POIFSFileSystem xlsf = null;

try

{

xlsf = new POIFSFileSystem(new FileInputStream(f));

wb = new HSSFWorkbook(xlsf);

}

catch (IOException ex)

{

System.err.println("错误:文件流输入有误。");

ex.printStackTrace();

}

HSSFSheet sheet = wb.getSheetAt(0);

return sheet;

}

//-----------------------------------

public String[][] outresult()

{

int length[] = outresultlength();

String result[][] = new String[length[0]][length[1]];

int lastrow = sheet.getLastRowNum()+1;

for (int i = 0; i < lastrow; i++)

{

HSSFRow row = sheet.getRow(i);

int lastcell = row.getLastCellNum();

for (int j = 0; j < lastcell; j++)

{

HSSFCell cell = row.getCell( (short) j);

if (cell == null)

result[i][j] = "blank";

else

{

switch (cell.getCellType())

{

case 1:

result[i][j] = cell.getStringCellValue();

break;

case 0:

result[i][j] = cell.getNumericCellValue() + "";

break;

case HSSFCell.CELL_TYPE_FORMULA:

result[i][j] = cell.getCellFormula()+"";

break;

case 3:

result[i][j] = "blank";

break;

default:

result[i][j] = "blank";

break;

}

}

}

}

for (int i = 0; i < result.length; i++)

{

for (int j = 0; j < result[i].length; j++)

{

if (result[i][j] == null)

{

result[i][j] = "blank";

}

}

}

return result;

}

//--------------------------------------------------------------------------------

public int[] outresultlength()

{

int lastrow = sheet.getLastRowNum()+1;//它是从零开始计算的。

HSSFRow row = sheet.getRow(0);

int lastcell = row.getLastCellNum();

int a[] =

{

lastrow, lastcell};

return a;

}

//----------------------------------------------------------------------

public void printRs(String[][] rs)

{

for (int i = 0; i < rs.length; i++)

{

for (int j = 0; j < rs[i].length; j++)

{

System.out.print("(" + i + "," + j + ") " + rs[i][j] + " ");

}

System.out.println(" ");

}

}

//-----------------------------------------------------------

public void outputXlsContent(String[][] xls)

{

String[][] content = xls;

JFileChooser chooser = new JFileChooser();

int result = chooser.showSaveDialog(chooser);

File testfile1 = chooser.getSelectedFile();

if (result == chooser.CANCEL_OPTION)

{

System.exit(0);

}

try

{

DataOutputStream out = new DataOutputStream(new FileOutputStream(

testfile1));

String fileName = testfile.getName();

String sql1 = fileName + "\n <table border=\"1\"> ";

for (int i = 0; i < content.length; i++)

{

sql1 = sql1 + " <tr> ";

for (int j = 0; j < content[i].length; j++)

{

sql1 = sql1 + " <td> " + content[i][j] + " </td> ";

}

sql1 = sql1 + " </tr> ";

}

sql1 = sql1 + " </table> ";

byte[] b = sql1.getBytes("gbk");

out.write(b);

out.close();

javax.swing.JOptionPane.showMessageDialog(null, "文件已经保存,按确定键退出!",

"结束!", javax.swing.JOptionPane.INFORMATION_MESSAGE);

}

catch (Exception ex)

{

ex.printStackTrace();

}

}

//-----------------------------------------------------------

public void outputXlsContent(String xls)

{

JFileChooser chooser = new JFileChooser();

int result = chooser.showSaveDialog(chooser);

File testfile1 = chooser.getSelectedFile();

if (result == chooser.CANCEL_OPTION)

{

System.exit(0);

}

try

{

DataOutputStream out = new DataOutputStream(new FileOutputStream(

testfile1));

String fileName = testfile.getName();

byte[] b = xls.getBytes("gbk");

out.write(b);

out.close();

}

catch (Exception ex)

{

ex.printStackTrace();

}

}

//-----------------------------------------------------------

public String generateinsertsql(String[][] content)

{

String fieldContent="";

int ilength=0;

String sql="";

for (int i = 1; i < content.length; i++)

{

fieldContent="'"+content[i][0]+"'";

for(int j=1;j<content[i].length;j++)

{

fieldContent=fieldContent+",'"+content[i][j]+"'";

}

sql=sql+"insert"+tbName+"("+Field+") values("+fieldContent+")\r\n";

ilength++;

}

System.out.print(sql);

System.out.println("lenth of i:"+ilength);

return sql;

}

//-----------------------------------------------------------

public static void main(String[] args)

{

testxls testxls1 = new testxls();

testxls1.filechooer();

//testxls1.sheet= testxls1.getSheet(testxls1.filechooer());

//testxls1.generateinsertsql(testxls1.outresult());

//testxls1.outputXlsContent(testxls1.generateinsertsql(testxls1.outresult()));

// System.exit(0);

}

}

文件过滤器类:

package testxls;

/**

* <p>Title: </p>

* <p>Description: </p>

* <p>Copyright: Copyright (c) 2004</p>

* <p>Company: </p>

* @author ClarkHillm@hotmailcom

* @version 1.0

*/

import java.io.*;

import javax.swing.filechooser.FileFilter;

public class XlsFileFiliter

extends javax.swing.filechooser.FileFilter

{

public String getFilePostfix(String FileName)//截取文件后缀。

{

return FileName.substring(FileName.lastIndexOf(".")+1);

}

//--------------------------------------------------

public String getDescription()

{

return "电子表格文档";

}

//--------------------------------------------------

public boolean accept(File f)

{

String extension = "xls";

if (f.isDirectory())

{

return true;

}

String name = f.getName();

if (getFilePostfix(name).equals(extension))

{

return true;

}

else

{

return false;

}

}

}

8. 结束

以上的对于POI的介绍只是很简单的引导大家入个门,如果大家感兴趣地话,可以自己参考POI的文档。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有