『壹』 poi讀取excel2007(大數據),然後保存到資料庫中
導致內存溢出是因為太多了內存不夠用,你可以先讀一部分然後做個標記,先把讀到的這部分數據寫入到資料庫里。然後再從標記處開始讀一部分再寫入,再讀再寫直到完。不要一次性全部讀完。
『貳』 POI動態生成Excel
項目功能里要求能夠將展示的報表導出excel,因為報表的數據都是動態從list傳進來的,所以使用了POI技術來動態構建excel文件。
網路里說POI是介個樣子的
「ApachePOI是Apache軟體基金會的開放源碼函式庫,POI提供API給java程序對MicrosoftOffice格式檔案讀和寫的功能」
簡單來說就是通過它的API可以進行創建/讀取文檔,sheet,行列單元格等操作,也可以設置文檔的各個樣式。
剛接觸這個任務的時候查了很多資料,最後主要是參考了這篇文章,程序復制粘貼就跑得通,對POI的整個理解可以得到很好地提升。
詳解JAVA POI導出EXCEL報表的操作(包括各種格式及樣式的實現)
然後參考著就實現了項目里要求的樣子啦
=======================================================
網路中的示例附上作為下次使用的備忘。
創建Excel 文檔
示例1將演示如何利用Jakarta POI API 創建Excel 文檔。
示例1程序如下:
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
import java .io.FileOutputStream;
public class CreateXL {
/** Excel 文件要存放的位置,假定在D盤下*/
public static String outputFile="D:\test.xls";
public static void main(String argv[]){
try{
// 創建新的Excel 工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 在Excel工作簿中建一工作表,其名為預設值
// 如要新建一名為"效益指標"的工作表,其語句為:
// HSSFSheet sheet = workbook.createSheet("效益指標");
HSSFSheet sheet = workbook.createSheet();
// 在索引0的位置創建行(最頂端的行)
HSSFRow row = sheet.createRow((short)0);
//在索引0的位置創建單元格(左上端)
HSSFCell cell = row.createCell((short) 0);
// 定義單元格為字元串類型
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
// 在單元格中輸入一些內容
cell.setCellValue("增加值");
// 新建一輸出文件流
FileOutputStream fOut = new FileOutputStream(outputFile);
// 把相應的Excel 工作簿存檔
workbook.write(fOut);
fOut.flush();
// 操作結束,關閉文件
fOut.close();
System.out.println("文件生成...");
}catch(Exception e) {
System.out.println("已運行 xlCreate() : " + e );
}
}
}
讀取Excel文檔中的數據
示例2將演示如何讀取Excel文檔中的數據。假定在D盤JTest目錄下有一個文件名為test1.xls的Excel文件。
示例2程序如下:
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
import java .io.FileInputStream;
public class ReadXL {
/** Excel文件的存放位置。注意是正斜線*/
public static String fileToBeRead="D:\test1.xls";
public static void main(String argv[]){
try{
// 創建對Excel工作簿文件的引用
HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(fileToBeRead));
// 創建對工作表的引用。
// 本例是按名引用(讓我們假定那張表有著預設名"Sheet1")
HSSFSheet sheet = workbook.getSheet("Sheet1");
// 也可用getSheetAt(int index)按索引引用,
// 在Excel文檔中,第一張工作表的預設索引是0,
// 其語句為:HSSFSheet sheet = workbook.getSheetAt(0);
// 讀取左上端單元
HSSFRow row = sheet.getRow(0);
HSSFCell cell = row.getCell((short)0);
// 輸出單元內容,cell.getStringCellValue()就是取所在單元的值
System.out.println("左上端單元是: " + cell.getStringCellValue());
}catch(Exception e) {
System.out.println("已運行xlRead() : " + e );
}
}
}
設置單元格格式
在這里,我們將只介紹一些和格式設置有關的語句,我們假定workbook就是對一個工作簿的引用。在Java中,第一步要做的就是創建和設置 字體和單元格的格式,然後再應用這些格式:
1、創建字體,設置其為紅色、粗體:
HSSFFont font = workbook.createFont();
font.setColor(HSSFFont.COLOR_RED);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
2、創建格式
HSSFCellStyle cellStyle= workbook.createCellStyle();
cellStyle.setFont(font);
3、應用格式
HSSFCell cell = row.createCell((short) 0);
cell.setCellStyle(cellStyle);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue("標題 ");
處理word文檔
import java .io.*;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
public class TestPoi {
public TestPoi() {
}
public static void main(String args[]) throws Exception
{
FileInputStream in = new FileInputStream ("D:\a.doc");
WordExtractor extractor = new WordExtractor();
String str = extractor.extractText(in);
//System.out.println("the result length is"+str.length());
System.out.println(str);
}
}
搜集鏈接 方便以後查閱
POI操作Excel常用方法總結
自己封裝的poi操作excel工具類
『叄』 關於Poi 大數據量Excel 導出時 文件過大的問題 怎麼解決
建議不要導出excel,當前excel中已經有支持cvs文件。
解釋:cvs文件的顯示方式和版xls的顯示方式一樣,並權且此顯示方式的執行效率要高於xls文件的額,因為cvs文件存儲的是數據直接直接用英文逗號分隔,xls是存儲的cell。所以在大量數據的情況下,都是導出為cvs文件。
備註:如果數據過多的話,建議可以分多次查詢導出,不要一次性導出,否則效率會很低。
-
『肆』 java 用POI處理比較大的word和excel文檔。
用它抄的底層介面,EVentModel來操作會襲比較省內存,但代碼寫起來比較麻煩。9M左右就內存溢出的話,應該是你設置的Heap size太小了。增大Heap的大小也是必須的。
如果是xls的,用JExcel會比POI省內存。但它不支持2010。
『伍』 Poi如何去讀取excel文件
直接全部在action裡面寫的,這個就不多說了,直接上代碼:
public String executeExcel() throws Exception{ String realPath = ServletActionContext.getServletContext().getRealPath("/fileupload");
System.out.println(fileFileName);
String filePath = "";
if(this.file!=null){
File saveFile = new File(new File(realPath),this.fileFileName);
filePath = realPath+"\\"+this.fileFileName;
System.out.println(filePath);
if(!saveFile.getParentFile().exists()){
saveFile.getParentFile().mkdirs(); }
FileUtils.File(file, saveFile); }
this.exlToDB(filePath);
ActionContext.getContext().put("message","導入成功");
return "success"; } //讀取excel2007,並把數據插入資料庫
public void exlToDB(String filePath){ boolean flag = true;
AllKpi akpi = new AllKpi(); try { // 文件流指向excel文件
FileInputStream fin=new FileInputStream(filePath);
XSSFWorkbook workbook = new XSSFWorkbook(fin);// 創建工作薄
XSSFSheet sheet = workbook.getSheetAt(0);// 得到工作表
XSSFRow row = null;// 對應excel的行
XSSFCell cell = null;// 對應excel的列
int totalRow = sheet.getLastRowNum();// 得到excel的總記錄條數
System.out.println(totalRow); // 以下的欄位一一對應資料庫表的欄位
float idd = 0.0f;
String id = "";
String Name = "";
String DEPT_NAME = "";
String Weight = "";
<span></span>String ALGORITHM = "";
String text = " ";
//String sql = "insert into DSP_TJ_KPI values(DSP_TJ_KPI_SEQ.nextval,?,?,?,'無',?)";
for (int i = 1; i <= totalRow; i++) {
row = sheet.getRow(i);
//System.out.println(row.getCell(0).toString());
if(row.getCell(0) != null && !"".equals(row.getCell(0)) && row.getCell(1) != null && !"".equals(row.getCell(1)) && row.getCell(2) != null && !"".equals(row.getCell(2)) && row.getCell(3) != null && !"".equals(row.getCell(3))){
cell = row.getCell((short) 0);
Name = cell.toString();
System.out.println(Name);
cell = row.getCell((short) 1);
Weight = cell.toString();
System.out.println(Weight);
cell = row.getCell((short) 2);
DEPT_NAME = cell.toString();
System.out.println(DEPT_NAME);
cell = row.getCell((short) 3);
ALGORITHM = cell.toString();
System.out.println(ALGORITHM);
akpi.setAllkpiName(Name);
akpi.setAllkpiDeptName(DEPT_NAME);
akpi.setAllkpiWeight(Weight);
akpi.setAlgorithm(ALGORITHM);
akpi.setText(text);
allKpiService.addAllKpi(akpi); //以下注釋代碼為連接jdbc測試代碼塊
/*pst = con.prepareStatement(sql);
//pst.setString(1, student_id);
pst.setString
(1, DEPT_NAME);
pst.setString
(2, Name);
pst.setString
(3, Weight);
<span></span>pst.setString(4, ALGORITHM);
pst.execute();*/
System.out.println("preparestatement successful"); } }
/*pst.close();
con.close();*/
fin.close(); } catch (FileNotFoundException e)
{
flag = false;
e.printStackTrace();
}
catch (IOException ex)
{
flag = false;
ex.printStackTrace();
}