java代碼寫excel和文本文檔的導入導出【轉】

例子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();

        }

    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章