Ⅰ java poi 提取txt文件內容添加到excel
幫你在網上找了以下幾個文章,可以解決你的問題,請參考。姿豎
Java POI Excel( pio:純java操作源擾excel的api )
http://www.cnblogs.com/zqmingok/archive/2010/04/16/1713480.html
java的poi技術讀取和導入Excel
http://www.cnblogs.com/hongten/archive/2012/02/22/java2poi.html
java poi 如何獲取獲得excel的總的行數和列數?
http://..com/question/220424660.html
利用Java+POI 讀寫Excel文檔&向Excel中插入圖片跡裂大
http://www.blogjava.net/renyangok/articles/63889.html
-------------------------------------------------------------------------------------------------
如果滿意,請採納。
Ⅱ java我在用poi導入文件夾下的Excel時,導入了幾百條後,後台就報Stream closed,這是為什麼
1.把你的內存弄大點。
2.升級到POI3.8(新版本對解析效率有改進)。
3.導入,到處最好統一到POI來。
4.一定要找到內存溢出的原因!!!
5.先把你的測滲尺碰試數據弄少一點,或者看看你困銷的叢談Office版本。。。
Ⅲ java,用POI實現將excel導入到資料庫
用到的類 是 :
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
try {
// List<String[]> 中的元素 行數組String[]為excel中的每一行
List<String[]> list = new ArrayList<String[]>();
InputStream is = new FileInputStream("test.xls");
HSSFWorkbook hwk = new HSSFWorkbook(is);// 將is流實例到 一個excel流里
HSSFSheet sh = hwk.getSheetAt(0);// 得到book第一個工作薄sheet
int rows = sh.getLastRowNum()+1 - sh.getFirstRowNum(); // 總行數
for(int i=0; i<rows; i++){
HSSFRow row = sh.getRow(i);
int cols = row.getLastCellNum()+1 - row.getFirstCellNum(); // 該行的總列數
String[] str = new String[cols]; // 用來存放該行每一列的值
for (int j = 0; j < cols; j++) {
Object col = row.getCell((short)j);
str[j] = col.toString();
}
}
......
......
循環變數 i 和 j 可以自己設定從第幾行開始讀,第旦滾幾列開始讀,下標從0開始。
然後扮橋你想做什麼判斷想做模缺余什麼數據匹配都可以自己加了。
poi.hssf.usermodel.* jar包要是網上找不到,就給我發郵件,我郵給你:[email protected]
Ⅳ 如何使用POI對Excel表進行導入和導出
導入POI的jar包
新建一個項目,在根目錄在新建一個lib文件夾,將答沒jar包復制粘貼到lib文件夾後,右鍵將其添加到項目的build path中,最後的結果如圖所示:
2
編寫java類,新建一個實體類,比如我們要導出資料庫的有關電腦的信息,那麼就建一個Computer實體類,代碼如下:
package com.qiang.poi;
public class Computer {
private int id;
private String name;
private String description;
private double price;
private double credit;
public int getId() {
return id;
}
public Computer(int id, String name, String description, double price,
double credit) {
super();
this.id = id;
this.name = name;
this.description = description;
this.price = price;
this.credit = credit;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public double getCredit() {
return credit;
}
public void setCredit(double credit) {
this.credit = credit;
}
}
3
新建一個寫入excel的方法,如write2excel,參數可以後面邊寫邊決定(站在一個不熟悉POI的角度)
public static void write2Excel(){}
4
創建操作Excel的HSSFWorkbook對象
HSSFWorkbook excel= new HSSFWorkbook();
創建HSSFSheet對象
Excel中的一個sheet(工作表)對應著java中的一個HSSFSheet對象,利用HSSFWorkbook對象可以創建一個HSSFSheet對象
如:創建一個sheet名為computer的excel
HSSFSheet sheet = excel.createSheet("computer");
創建第一行標題信息的HSSFRow對象
我們都知道excel是表格,即由一行一行組成的,那麼這一行在java類中就是一個HSSFRow對象,我們通過HSSFSheet對象就可以創建HSSFRow對象
如:創建表格中的第一行(我們常用來做標題的行) HSSFRow firstRow = sheet.createRow(0); 注意下標從0開始
創建標題行中的HSSFCell數組
當然,excel中每一行是由若干個輪舉卜單元格,我們常稱為cell,它對應著java中的HSSFCell對象
如:創建5個單元格 HSSFCell cells[] = new HSSFCell[5];
//假設我們一行有五列數據
創建標題數據,並通過HSSFCell對象的setCellValue()方法對每個單元格進行賦值
既然單元格都准備好了,那最後是不是該填臘穗充數據了呀。對的,沒錯。填充數據之前,得把數據准備好吧,
數據:String[] titles = new String[]{"id","name","description","price","credit"};
插入一句話: 在這個時代,能讓機器做的,盡量不讓人來做,記住這句話。
好的,繼續。現在就通過for循環來填充第一行標題的數據
for (int i = 0; i < 5; i++) {
cells[0] = firstRow.createCell(i);
cells[0].setCellValue(titles[i]);
}
數據分析
第一行標題欄創建完畢後,就准備填充我們要寫入的數據吧,在java中,面向對象給我們帶來的好處在這里正好體現了,沒錯
把要填寫的數據封裝在對象中,即一行就是一個對象,n行就是一個對象列表嘛,好的,走起。
創建對象Computer,私有屬性id,name,description,price,credit,以及各屬性的setter和getter方法,如步驟二所示。
假設我們要寫入excel中的數據從資料庫查詢出來的,最後就生成了一個List<Computer>對象computers
數據寫入
具體數據有了,又該讓機器幫我們幹活了,向excel中寫入數據。
for (int i = 0; i < computers.size(); i++) {
HSSFRow row = sheet.createRow(i + 1);
Computer computer = computers.get(i);
HSSFCell cell = row.createCell(0);
cell.setCellValue(computer.getId());
cell = row.createCell(1);
cell.setCellValue(computer.getName());
cell = row.createCell(2);
cell.setCellValue(computer.getDescription());
cell = row.createCell(3);
cell.setCellValue(computer.getPrice());
cell = row.createCell(4);
cell.setCellValue(computer.getCredit());
}
將數據真正的寫入excel文件中
做到這里,數據都寫好了,最後就是把HSSFWorkbook對象excel寫入文件中了。
OutputStream out = null;
try {
out = new FileOutputStream(file);
excel.write(out);
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("數據已經寫入excel"); //溫馨提示
看看我的main方法吧
public static void main(String[] args) throws IOException {
File file = new File("test1.xls");
if(!file.exists()){
file.createNewFile();
}
List<Computer> computers = new ArrayList<Computer>();
computers.add(new Computer(1,"宏碁","筆記本電腦",3333,9.0));
computers.add(new Computer(2,"蘋果","筆記本電腦,一體機",8888,9.6));
computers.add(new Computer(3,"聯想","筆記本電腦,台式機",4444,9.3));
computers.add(new Computer(4, "華碩", "筆記本電腦,平板電腦",3555,8.6));
computers.add(new Computer(5, "註解", "以上價格均為捏造,如有雷同,純屬巧合", 1.0, 9.9));
write2excel(computers, file);
}
工程目錄及執行main方法後的test1.xls數據展示
源碼分享,computer就不貼了
package com.qiang.poi;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
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;
public class ReadExcel {
public static void main(String[] args) throws IOException {
File file = new File("test1.xls");
if(!file.exists()){
file.createNewFile();
}
List<Computer> computers = new ArrayList<Computer>();
computers.add(new Computer(1,"宏碁","筆記本電腦",3333,9.0));
computers.add(new Computer(2,"蘋果","筆記本電腦,一體機",8888,9.6));
computers.add(new Computer(3,"聯想","筆記本電腦,台式機",4444,9.3));
computers.add(new Computer(4, "華碩", "筆記本電腦,平板電腦",3555,8.6));
computers.add(new Computer(5, "註解", "以上價格均為捏造,如有雷同,純屬巧合", 1.0, 9.9));
write2excel(computers, file);
}
public static void write2excel(List<Computer> computers,File file) {
HSSFWorkbook excel = new HSSFWorkbook();
HSSFSheet sheet = excel.createSheet("computer");
HSSFRow firstRow = sheet.createRow(0);
HSSFCell cells[] = new HSSFCell[5];
String[] titles = new String[] { "id", "name", "description", "price",
"credit" };
for (int i = 0; i < 5; i++) {
cells[0] = firstRow.createCell(i);
cells[0].setCellValue(titles[i]);
}
for (int i = 0; i < computers.size(); i++) {
HSSFRow row = sheet.createRow(i + 1);
Computer computer = computers.get(i);
HSSFCell cell = row.createCell(0);
cell.setCellValue(computer.getId());
cell = row.createCell(1);
cell.setCellValue(computer.getName());
cell = row.createCell(2);
cell.setCellValue(computer.getDescription());
cell = row.createCell(3);
cell.setCellValue(computer.getPrice());
cell = row.createCell(4);
cell.setCellValue(computer.getCredit());
}
OutputStream out = null;
try {
out = new FileOutputStream(file);
excel.write(out);
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Ⅳ 用POI將Mysql數據導入到Excel中去
在我們實際的開發中 表現層的解決方案雖然有多樣 但是IE瀏覽器已成為最多人使用的瀏覽器 因為大家都用Windows 在企業辦公系統中 常常有客戶這樣子要求 你要把我們的報表直接用Excel打開 或者是 我們已經習慣用Excel列印 這樣子如果開發是沒有問題的用來進行這些數據導入導出支持的都是很好 如果你使用的是SQL Server資料庫那就更方便了 筆者也曾體會開發這些功能的方便性 但是有j ee這個更有前途的開放式的開發環境 難道我為了解決列印的要求去另寫客戶端的控制項?或者在伺服器端使用本地代碼?第一種方案的問題是關鍵數據的處理有時候不能在客戶端做 第 種方案的問題是犧牲了代碼的可移植性和穩定性 如果讓客戶端只負責處理生成好的報表 那將是一種誘人的選擇
Apache的Jakata項目的POI子項目 目標是處理ole 對象 目前比較成熟的是HSSF介面 處理MS Excel( )對象 它不象我們僅僅是用csv生成的沒有格式的可以由Excel轉換的東西 而是真正的Excel對象 你可以控制森物一些屬性如sheet cell等等 這是一個年輕的項目 所以象HDF這樣直接支持Word對象的好東西仍然在設計此棚液中 其它支持word格式的純java方案還有itext 不過也是仍在奮斗中 但是HSSF已經成熟到能夠和足夠我們使用了 另外 無錫永中Office的實現方案也是純java的解決方案 不過那也是完全商業的產品 並不是公開代碼項目 其實 從開發歷史的角度講 在 年代中期starOffice的原作者在德國成立了StarOffice suite公司 然後到 年夏天starOffice被sun收購 再到 年 月starOffice 的發布 並且從starOffice 開始 starOffice建立在OpenOffice的api的基礎上 這個公開代碼的office項目已經進行了很長的時間 雖然那是由C++寫的 但是POI的代碼部分也是由openOffice改過來的 所以 應該對POI充滿足夠的信心 國內已經有部分公司在他們的辦公自動化等Web項目中使用poi了 如日恆的ioffice 海泰的HTOffice等
java當初把核心處理設成Unicode 帶來的好處是另代碼適應了多語言環境 然而由於老外的英語只有 個字母 有些情況下 一些程序員用 位的byte處理 一不小心就去掉了CJK的高位 或者是由於習慣在程序中採用硬編碼 還有多種原因 使得許多java應用在CJK的處理上很煩惱 還好在POI HSSF中考慮到這個問題 可以設置encoding為雙位元組
POI可以到下載到 編譯好的jar主要有這樣 個 poi包 poi Browser包 poi hdf包 poi hssf常式包 實際和爛運行時 需要有poi包就可以了 如果用Jakarta ant編譯和運行 下載apache Jakarta POI的release中的src包 它裡面已經為你生成好了build文件了 只要運行ant就可以了(ant 的安裝和使用在此不說了) 如果是用Jbuilder 運行 請在新建的項目中加入poi包 以Jbuilder 為例 選擇Tools菜單項的config libraries 選項 新建一個lib 在彈出的菜單中選擇poi包 如這個jakarta poi final jar 把poi添加到jbuilder中 然後 右鍵點擊你的項目 在project的properties菜單中path的required Libraries中 點add 添加剛才加入到jbuilder中的poi到你現在的項目中 如果你僅僅是為了熟悉POI hssf的使用 可以直接看POI的samples包中的源代碼 並且運行它 hssf的各種對象都有常式的介紹 hssf提供的常式在 apache poi hssf usermodel examples包中 共有 個 生成的目標xls都是workbook xls 如果你想看更多的常式 可以參考hssf的Junit test cases 在poi的包的源代碼中有 hssf都有測試代碼
首先 到上去下載POI 登錄到該網址以後 選擇紅 *** 域的poi bin final zip來下載
下載以後解壓 解壓目錄為
在Eclipse中設置對poi bin final jar的庫引用
在Eclipse中新建一個名字叫POIExcel的Java工程 右鍵POIExcel項目的項目名 選擇Build Path 再選擇Add External Archives 然後找到poi bin final jar這個包將其引進到工程中來
Excel 結構 HSSFWorkbook excell 文檔對象介紹 HSSFSheet excell的表單 HSSFRow excell的行 HSSFCell excell的格子單元 HSSFFont excell字體 HSSFName 名稱 HSSFDataFormat 日期格式 輔助操作包括 HSSFDateUtil 日期 HSSFPrintSetup 列印 HSSFErrorConstants 錯誤信息表
將數據導出到Excel中的實例
創建一個空白的Excel文件
我們創建一個最普通的Java應用程序即可 程序代碼如下: HSSFWorkbook wb=new HSSFWorkbook(); FileOutputStream fileout = new FileOutputStream( C:\test xls ); wb write(fileout); fileout close();
FileOutputStream屬於JDK的數據流對象 通過它來將一個名為test xls文件創建在C盤根目錄下 運行該程序後可以看到在C盤上的根目錄上多了一個Excel文件
如果將程序中的FileOutputStream( C:\test xls )的參數改為 test xls 則文件就會創建在該項目的根目錄下
往Excel的單元格中寫入信息
POI把Excel分解成幾個對象 自頂向下的關系是:工作薄(HSSFWorkbook) >表格(HSSFSheet) >表格行(HSSFRow) >單元格(HSSFCell) 將資料庫中表的數據導入到Excel中 首先我們要將資料庫中的表的數據查詢出來 這里我們通過Hibernate來將資料庫中addres *** ook_table表的數據查詢出來 然後通過循環將表中的數據導入到Excel中去
HSSFWorkbook wb=new HSSFWorkbook(); HSSFSheet sheet=wb createSheet( new sheet ); try { //通過Hibernate來查詢addres *** ook_table表中的數據 將其存儲在List中 Transaction tx = session beginTransaction(); hibernate Query query= session createQuery( from Addres *** ookTable ); List list = query list(); mit(); int k = ; //創建表格 創建表格行和單元格 將資料庫中表的欄位存儲在單元格中 for(Iterator it=erator();it hasNext();){ Addres *** ookTable user =(Addres *** ookTable)it next(); HSSFRow row=sheet createRow((short)k); row createCell((short) ) setCellValue(user getId()); row createCell((short) ) setCellValue(user getName()); row createCell((short) ) setCellValue(user getAddress()); row createCell((short) ) setCellValue(user getPhone()); k++; } FileOutputStream fileout = new FileOutputStream( C:\test xls ); wb write(fileout); fileout close(); log error( Successful!! ); } catch (HibernateException e) { log error( Insert Exception! ); e printStackTrace(); }
lishixin/Article/program/Oracle/201311/17278
Ⅵ java用poi實現將資料庫裡面的數據導入已經存在的excel模板中。最好有實例參考,謝謝。
/**
*通過EXCEL模板導入團隊信息
*/
@ResponseBody
@RequestMapping("importTemp")
publicMap<String,String>importTemp(HttpServletRequestrequest,HttpSessionsession,
@RequestParam(value="excel",required=false)MultipartFilefile,HttpServletResponseresponse){
Yhbyhb=(Yhb)session.getAttribute(WebConstants.CURRENT_USER);
Stringzjr=yhb.getYhid();
List<DrTdb>tdxxList=newArrayList<DrTdb>();
Map<String,String>map=newHashMap<String,String>();
Stringsfcg="1";
Stringbcghs="";
Stringbcgyy="";
HSSFWorkbookworkbook=null;
try{
workbook=newHSSFWorkbook(file.getInputStream());
HSSFSheetsheet=workbook.getSheetAt(0);
if(sheet!=null)
{
intd=sheet.getPhysicalNumberOfRows();
other:for(inti=7;i<sheet.getPhysicalNumberOfRows();i++)
{
sfcg="2";
HSSFRowrow=sheet.getRow(i);
DrTdbtd=newDrTdb();
intrs=1;
//td.setTdbm("T"+DateUtil.CurrentTime("MM-dd"));
td.setZjr(zjr);
for(intj=0;j<8;j++)
{
HSSFCellcell=row.getCell(j);
if(j==0){
if(cell!=null){
搜喊姿StringcellStr=cell.toString();
if(isDigit(cellStr)!=""){
StringNDID=(String)tdglService.queryForObject("tdExcel.queryNd",isDigit(cellStr));
td.setNd(NDID);
}else{
sfcg="0";
bcghs=String.valueOf(i+1);
bcgyy="請填寫正確的年度";
breakother;
}
}else{
sfcg="0";
bcghs=String.valueOf(i+1);
bcgyy="年度不可為空";
breakother;
}
}elseif(j==1){
if(cell!=null){
StringcellStr=cell.toString();
StringYXID=(String)tdglService.queryForObject("tdExcel.queryIdByYx",cellStr);
StringYXDM=(String)tdglService.queryForObject("tdExcel.queryDmByYx",cellStr);
if(YXDM==null||YXDM==""){
sfcg="0";
bcghs=String.valueOf(i+1);
bcgyy="院系不存在";
breakother;
}
td.setSsyx(YXID);
//設置團隊編碼
StringcurrentYear=DateUtil.CurrentTime("yyyy");//當前年份
Stringtdbm="";
Stringstr=null;
str="T"+currentYear+YXDM;
StringmaxID=(String)tdglService.queryForObject("tdgl.queryMaxID",str);//當前團隊最大ID
Stringstr_q=maxID.substring(1);
intMAXID=Integer.parseInt(str_q);//將返回的字元串去掉T
tdbm="T"+(MAXID+1);
世絕滲唯td.setTdbm(tdbm);
}else{
sfcg="0";
bcghs=String.valueOf(i+1);
bcgyy="院系不存在";
breakother;
}
}elseif(j==3){
if(cell!=null){
StringcellStr=cell.toString();
String[]zdjs=cellStr.split(",");
for(intin=0;in<zdjs.length;in++){
zdjs[in]=zdjs[in].substring(1,zdjs[in].length()-1);
//zdjs[in]=isDigit(zdjs[in]);
zdjs[in]=(String)tdglService.queryForObject("tdExcel.queryIdByZgh",zdjs[in]);
if("".equals(zdjs[in])||zdjs[in]==null){
sfcg="0";
bcghs=String.valueOf(i+1);
bcgyy="教師編號有誤";
breakother;
}
}
td.setZdjs(zdjs);
}else{
sfcg="0";
bcghs=String.valueOf(i+1);
bcgyy="指導教師不可為空";
breakother;
}
}elseif(j==5){
if(cell!=null){
StringcellStr=cell.toString();
cellStr=cellStr.substring(1,cellStr.length()-1);
//BigDecimalbg=newBigDecimal(cellStr);
//cellStr=bg.toPlainString();
cellStr=(String)tdglService.queryForObject("tdExcel.queryIdByXh",cellStr);
if("".equals(cellStr)||cellStr==null){
sfcg="0";
bcghs=String.valueOf(i+1);
bcgyy="團隊組長學號有誤";
breakother;
}
else{
StringTdid=(String)tdglService.queryForObject("tdExcel.queryryid",cellStr);
StringXM=(String)tdglService.queryForObject("tdExcel.queryXmBy",cellStr);
if(Tdid!=null){
sfcg="0";
bcghs=String.valueOf(i+1);
bcgyy="團隊組長"+XM+"已存在";
breakother;
}
}
td.setTdzz(cellStr);
}else{
sfcg="0";
bcghs=String.valueOf(i+1);
bcgyy="團隊組長不可為空";
breakother;
}
}elseif(j==7){
if(cell!=null){
StringcellStr=cell.toString();
String[]tdzy=cellStr.split(",");
for(intk=0;k<tdzy.length;k++){
tdzy[k]=tdzy[k].substring(1,tdzy[k].length()-1);
tdzy[k]=(String)tdglService.queryForObject("tdExcel.queryIdByXh",tdzy[k]);
if("".equals(tdzy[k])||tdzy[k]==null){
sfcg="0";
bcghs=String.valueOf(i+1);
bcgyy="團隊組員學號有誤";
breakother;
}
rs++;
}
td.setTdzy(tdzy);
}else{
sfcg="0";
bcghs=String.valueOf(i+1);
bcgyy="團隊組員不可為空";
breakother;
}
}
}
td.setRs(String.valueOf(rs));
tdxxList.add(td);
}
}
}catch(IOExceptione){
e.printStackTrace();
}
if("2".equals(sfcg)){
for(DrTdbtdxx:tdxxList){
tdglService.insert("tdExcel.addTdxx",tdxx);
tdglService.insert("tdExcel.addTdzz",tdxx);
tdglService.insert("tdExcel.addTdzy",tdxx);
tdglService.insert("tdExcel.addZdjs",tdxx);
}
}
map.put("sfcg",sfcg);
map.put("bcghs",bcghs);
map.put("bcgyy",bcgyy);
returnmap;
}
看不懂留言
Ⅶ java poi Excel大數據量導入怎麼提高速度
記得有個屬性,
POI3.8的SXSSF包是XSSF的一個擴展版本,支持流處理,在生成大數據量的電子表格且堆空間有限時使用。SXSSF通過限制內存中可訪問的記錄行數來實現其低內存利用,當達到限定值時,新一行神肢派數據的加入會引起老一行的數據刷新到硬碟。
比如內存中限制行數為100,當行號到達101時,行號為0的記錄刷新到硬碟並從內存中刪除,當行號到達102時,游賀行號為1的記錄刷新飢遲到硬碟,並從內存中刪除,以此類推。
rowAccessWindowSize代表指定的內存中緩存記錄數,默認為100,此值可以通過
new SXSSFWorkbook(int rowAccessWindowSize)或SXSSFSheet.setRandomAccessWindowSize(int windowSize)來設置。
Ⅷ java POI 導入excel時候日期格式轉化
Java的不會,但是思路應該是差不瞎鄭多的,你數據為Null那你就用三元表達式判斷,慶卜如果為Null就賦一個值給它。(請自行網路三元表達式)磨差頌