例子1-----》利用jxl包來完成excel導入導出
JXL包提供了JAVA環境下操作EXCEL文件的方法,可對EXCEL文件進行讀寫操作。總體而言這個包的使用非常簡單,因工作需要對它進行了簡單的應用,現寫一下個人總結。
JXL包似乎對某些版本的EXCEL文件不太兼容,網站上說它支持EXCEL95-2000。不知道是不是這個原因,在讀取EXCEL XP文件時(文件中使用了“數據有效性”等格式),會發出一些警告信息,雖然不影響使用,但終究不太好看。所以下面這個例子是從一個EXCEL文件中讀取數據,並將數據寫入另一文件中,清除掉文件中使用的所有格式。在清除掉文件中使用的格式之後,再讀取這個文件就一切正常了。
import jxl.*;
import jxl.write.*;i
mport java.io.*;
public class CleanExcel {
public static void clean(String inFile, String outFile){
//首先需要聲明輸入輸出流與Workbook,Workbook對應Excel文件
InputStream is = null;
Workbook inWb = null;
OutputStream os = null;
WritableWorkbook outWb = null;
try{
//實例化輸入輸出流與Workbook
is = new FileInputStream(inFile);
//Workbook無法通過new關鍵字進行實例化,必須調用Workbook.getWorkbook(File)靜態方法
inWb = Workbook.getWorkbook(is);
os = new FileOutputStream(outFile);
outWb = Workbook.createWorkbook(os);
//下面這一句是選擇原文件的工作表,Sheet對應的是Excel中的Sheet
Sheet inSheet = inWb.getSheet("Sheet1");
//WritableSheet爲要創建的文件中的工作表
WritableSheet outSheet = outWb.createSheet("Sheet1", 0);
//設置循環標誌
boolean flag = true;
//循環條件
int i = 0;
while(flag){
//Cell對應一個單元格,getCell方法第一個參數對應列,第二個參數對應行。
//注意:行和列的開始座標均爲0,與JAVA中的數組一樣
Cell tmp = inSheet.getCell(0, i);
//取得每行第一列單元格中的數據。不管單元格中的數據在EXCEL中爲何種類型,讀取之後都將成爲String類型
String c = tmp.getContents().trim();
//爲處理方面,EXCEL文件中最後一行的第一個單元格設置了一個break標誌,讀到這一行時將退出循環
if(c.equals("break")){
flag = false;
break;
}
//我處理的EXCEL表格爲8列
for(int j = 0; j < 8; j++){
//取得源單元格
Cell inCell = inSheet.getCell(j, i);
//獲取數據
String content = inCell.getContents().trim();
//創建新單元格,並用數據填充
Label labelCF=new Label(j, i, content);
//將新單元格加入到新工作表中
outSheet.addCell(labelCF);
}
i++;
}
//寫入文件
outWb.write();
//關閉流
outWb.close();
os.close();
}catch(Exception e){
e.printStackTrace();
}
}
//測試
public static void main(String[] args){
try {
String in = "old.xls";
String out = "new.xls";
CleanExcel.clean(in, out);
} catch (Exception e) {
e.printStackTrace();
}
}
}
-----------------------------------------------------------------------
例子2-----》利用jxl包來完成excel導入導出
import java.io.File;
import java.io.IOException;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
public class ExcelTest {
public static void main(String[] adf) {
try {
Workbook workbook = Workbook .getWorkbook(new File( "d://myfile.xls"));
Sheet sheet = workbook.getSheet(0);
String[] tempValue = new String[sheet.getColumns()];
for (int i = 0; i < sheet.getRows(); i++) {
for (int j = 0; j < sheet.getColumns(); j++) {
String value = sheet.getCell(j, i).getContents();
if (value.equals( " "))
value = tempValue[j];
System.out.print(value + "/t/t/t/t/t/t/t ");
tempValue[j] = value;
}
System.out.println( " ");
}
} catch (BiffException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
-----------------------------------------------------------------------
例子3-----》利用apache包來完成excel導入導出
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
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.poifs.filesystem.POIFSFileSystem;
public class POITest {
private static Connection conn = null;
private static Statement stmt = null;
private static boolean connectDB2() {
String url = "";
String username = "username";
String password = "password";
//加載驅動程序以連接數據庫
try {
//添加類庫驅動包db2jcc.jar和db2jcc_license_cu.jar
Class.forName("com.ibm.db2.jcc.DB2Driver");
url = "jdbc:db2://192.168.0.1:50000/dbname";
//添加類庫驅動包db2java.jar
//Class.forName("com.ibm.db2.jdbc.app.DB2Driver").newInstance();
//url = "jdbc:db2:njtcdata";
conn = DriverManager.getConnection(url, username, password);
stmt = conn.createStatement();
}
//捕獲加載驅動程序異常
catch (ClassNotFoundException cnfex) {
System.err.println("裝載JDBC驅動程序失敗。");
cnfex.printStackTrace();
return false;
}
//捕獲連接數據庫異常
catch (SQLException sqlex) {
System.err.println("無法連接數據庫");
sqlex.printStackTrace();
//System.exit(1); // terminate program
return false;
}
return true;
}
private static boolean readExcelToDB2() {
POIFSFileSystem fs = null;
HSSFWorkbook wb = null;
try {
fs = new POIFSFileSystem(new FileInputStream("c://test.xls"));
wb = new HSSFWorkbook(fs);
} catch (IOException e) {
e.printStackTrace();
return false;
}
HSSFSheet sheet = wb.getSheetAt(0);
HSSFRow row = null;
HSSFCell cell = null;
String name = "";
int id = 0;
int rowNum, cellNum;
int i;
rowNum = sheet.getLastRowNum();
for (i = 0; i <= rowNum; i++) {
row = sheet.getRow(i);
//cellNum = row.getLastCellNum();
cell = row.getCell((short) 0);
name = cell.getStringCellValue();
cell = row.getCell((short) 1);
id = (int) cell.getNumericCellValue();
String sql = "insert into TEST(ID, NAME) values(" + id + ",'" + name + "')";
try {
stmt.executeUpdate(sql);
} catch (SQLException e1) {
e1.printStackTrace();
return false;
}
}
return true;
}
public static void main(String[] args) {
if (connectDB2()==true){
if (readExcelToDB2()==true)
System.out.println("數據導入成功");
else
System.out.println("數據導入失敗");
}
else{
System.out.println("數據庫連接失敗");
}
}
}
-----------------------------------------------------------------------
例子4-----》文本文件導入例子
1、將數據按一定規律錄入到一個文本文件,每一行代表一條記錄。
下面是數據庫建表SQL:
CREATE TABLE t_FltPsgInfo -- 航班乘客信息
(
FltNum VARCHAR(10), -- 航班號
FltLine VARCHAR(30), -- 航線
FltDate VARCHAR(10), -- 日期
PsgName VARCHAR(30), -- 姓名
PsgType VARCHAR(30), -- 乘客類型,數字表示,目前是1-13
PsgSex VARCHAR(1), -- 0 男 1 女
PsgCab VARCHAR(1), -- 幾等艙, F/Y 艙位按字母順序排列
PsgSeatNo VARCHAR(5),-- 座位號 2A,22F,根據這個得到一排有多少個座位,共有多少排座位信息
PsgInfo VARCHAR(2048) -- 詳細信息,可能很長
)
我們將向表t_FltPsgInfo中插入1000條記錄。
新建一個文本文件,每一行代表一條記錄,如:
HU7804,廣州-北京,2007-07-18,謝麗珍,3,1,C,3A,服務保障信息:未用餐隨行人員…
其中以“,”作爲字段的分隔標誌,我們在解析這個文本文件時將根據“,”來拆分字段值。
按照上面的格式,將要插入的數據輸入到文本文件中,注意,是每一行代表一條記錄,或者你已有從數據庫導出的文本文件,那你就只需找到文件的規律,稍作調整就行了。
2、編寫Java源碼
1》數據庫操作類InsertDB.java
package test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class InsertDB {
private static final String user = "sa";
private static final String pwd = "sa";
private static final String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=hhfly";
private static final String driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
public static Connection getCon() {
Connection con = null;
try {
Class.forName(driver).newInstance();
con = DriverManager.getConnection(url, user, pwd);
if (con != null) {
System.out.println("你已連接到數據庫:"
+con.getCatalog());
}
} catch (Exception e) {
System.out.println("連接數據庫失敗!");
e.printStackTrace();
}
return con;
}
public boolean insertDB(String FltNum, String FltLine, String FltDate, String PsgName, String PsgType, String PsgSex, String PsgCab,String PsgSeatNo, String PsgInfo) {
Connection con = null;
Statement stm = null;
boolean flag = false;
String sql = "insert into t_FltPsgInfo values('" + FltNum + "','" + FltLine + "','" + FltDate + "','" + PsgName + "','" + PsgType
+ "','" + PsgSex + "','" + PsgCab + "','" + PsgSeatNo + "','"+ PsgInfo + "')";
try {
con = getCon();
stm = con.createStatement();
int i = stm.executeUpdate(sql);
if (i > 0) {
flag = true;
System.out.println(flag + "插入數據成功!");
}
} catch (Exception e) {
flag = false;
e.printStackTrace();
} finally {
close(null, stm, con);
}
return flag;
}
//關閉相關連接
public void close(ResultSet rs, Statement stm, Connection con) {
if (rs != null)
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
if (stm != null)
try {
stm.close();
} catch (Exception e) {
e.printStackTrace();
}
if (con != null)
try {
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2》數據採集類DataGather.java
package test;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;
public class DataGather {
private static final String path = "src/resource/test";
public static final String openFileStyle = "r";
public static final String fieldLimitChar = ",";
public static final int fieldAllCount = 9;
private int count;
private String FltNum;
private String FltLine;
private String FltDate;
private String PsgName;
private String PsgType;
private String PsgSex;
private String PsgCab;
private String PsgSeatNo;
private String PsgInfo;
/*
* 功能:解析文本文件
*/
public void loadFile() {
try {
RandomAccessFile raf = new RandomAccessFile(path,openFileStyle);
String line_record = raf.readLine();
while (line_record != null) {
// 解析每一條記錄
parseRecord(line_record);
line_record = raf.readLine();
}
System.out.println("共有合法的記錄" + count + "條");
} catch (Exception e) {
e.printStackTrace();
}
}
/** 功能:具體解析每一條記錄,這裏可以增加很多對記錄的解析判斷條件,如是否爲字母、
* 數字、email等。 */
private void parseRecord(String line_record) throws Exception {
//拆分記錄
String[] fields = line_record.split(fieldLimitChar);
if (fields.length == fieldAllCount) {
FltNum = tranStr(fields[0]);
FltLine = tranStr(fields[1]);
FltDate = tranStr(fields[2]);
PsgName = tranStr(fields[3]);
PsgType = tranStr(fields[4]);
PsgSex = tranStr(fields[5]);
PsgCab = tranStr(fields[6]);
PsgSeatNo = tranStr(fields[7]);
PsgInfo = tranStr(fields[8]);
System.out.println(FltNum + " " + FltLine + " " + FltDate + " " + PsgName + " " + PsgType + " " + PsgSex + " " + PsgCab + " " + PsgSeatNo + " " + PsgInfo);
InsertDB db = new InsertDB();
db.insertDB(FltNum, FltLine, FltDate, PsgName, PsgType, PsgSex, PsgCab, PsgSeatNo, PsgInfo);
count++;
}
}
private String tranStr(String oldstr) {
String newstr = "";
try {
newstr = new String(oldstr.getBytes("ISO-8859-1"), "GBK");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return newstr;
}
}
3》測試類Test.java
package test;
public class Test {
public static void main(String[] args) {
try {
DataGather gather = new DataGather ();
gather.loadFile();
} catch (Exception e) {
e.printStackTrace();
}
}
}