① java poi Excel2007以上的版本導入資料庫 數據量大 內存溢出如何解決
記得有個屬性,
POI3.8的SXSSF包是XSSF的一個擴展版本,支持流處理,在生成大數據量的電子表格且堆空間有限時使用。SXSSF通過限制內存中可訪問的記錄行數來實現其低內存利用,當達到限定值時,新一行數據的加入會引起老一行的數據刷新到硬碟。
比如內存中限制行數為100,當行號到達101時,行號為0的記錄刷新到硬碟並從內存中刪除,當行號到達102時,行號為1的記錄刷新到硬碟,並從內存中刪除,以此類推。
rowAccessWindowSize代表指定的內存中緩存記錄數,默認為100,此值可以通過
new SXSSFWorkbook(int rowAccessWindowSize)或SXSSFSheet.setRandomAccessWindowSize(int windowSize)來設置。
② java poi讀取Excel2007 的問題
你的郵箱 被服務商限制,超過1兆的郵件都收不了。。。。。。.jar包有1.4兆。
我都編輯好了,看到速度給我發QQ郵件: [email protected] ,我再重新給你郵
③ java poi怎麼導入excel數據
package poi;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcel001 {
public static void main(String[] args) {
readXml("D:/test.xlsx");
System.out.println("-------------");
readXml("d:/test2.xls");
}
public static void readXml(String fileName){
boolean isE2007 = false; //判斷是否是excel2007格式
if(fileName.endsWith("xlsx"))
isE2007 = true;
try {
InputStream input = new FileInputStream(fileName); //建立輸入流
Workbook wb = null;
//根據文件格式(2003或者2007)來初始化
if(isE2007)
wb = new XSSFWorkbook(input);
else
wb = new HSSFWorkbook(input);
Sheet sheet = wb.getSheetAt(0); //獲得第一個表單
Iterator<Row> rows = sheet.rowIterator(); //獲得第一個表單的迭代器
while (rows.hasNext()) {
Row row = rows.next(); //獲得行數據
System.out.println("Row #" + row.getRowNum()); //獲得行號從0開始
Iterator<Cell> cells = row.cellIterator(); //獲得第一行的迭代器
while (cells.hasNext()) {
Cell cell = cells.next();
System.out.println("Cell #" + cell.getColumnIndex());
switch (cell.getCellType()) { //根據cell中的類型來輸出數據
case HSSFCell.CELL_TYPE_NUMERIC:
System.out.println(cell.getNumericCellValue());
break;
case HSSFCell.CELL_TYPE_STRING:
System.out.println(cell.getStringCellValue());
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
System.out.println(cell.getBooleanCellValue());
break;
case HSSFCell.CELL_TYPE_FORMULA:
System.out.println(cell.getCellFormula());
break;
default:
System.out.println("unsuported sell type");
break;
}
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
參考自http://blog.csdn.net/shuwei003/article/details/6741649
④ java poi Excel2007里的SXSSFWorkbook怎樣讀取文件 SXSSFWorkbook只能寫嗎,那怎樣獲得要寫的內容
Notes是一個具有Id , RuleID , MainId 屬性的javaBean.
public static List<Notes> readFromXLS2007(String filePath) {
File excelFile = null;// Excel文件對象
InputStream is = null;// 輸入流對象
String cellStr = null;// 單元格,最終按字元串處理
List<Notes> NotesList = new ArrayList<Notes>();// 返回封裝數據的List
Notes Notes = null;// 每一個Notes對象
try {
excelFile = new File(filePath);
is = new FileInputStream(excelFile);// 獲取文件輸入流
XSSFWorkbook workbook2007 = new XSSFWorkbook(is);// 創建Excel2007文件對象
XSSFSheet sheet = workbook2007.getSheetAt(0);// 取出第一個工作表,索引是0
// 開始循環遍歷行,表頭不處理,從1開始
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
Notes = new Notes();// 實例化Notes對象
XSSFRow row = sheet.getRow(i);// 獲取行對象
if (row == null) {// 如果為空,不處理
continue;
}
// 循環遍歷單元格
for (int j = 0; j < row.getLastCellNum(); j++) {
XSSFCell cell = row.getCell(j);// 獲取單元格對象
if (cell == null) {// 單元格為空設置cellStr為空串
cellStr = "";
} else if (cell.getCellType() == XSSFCell.CELL_TYPE_BOOLEAN) {// 對布爾值的處理
cellStr = String.valueOf(cell.getBooleanCellValue());
} else if (cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {// 對數字值的處理
cellStr = cell.getNumericCellValue() + "";
} else {// 其餘按照字元串處理
cellStr = cell.getStringCellValue();
}
// 下面按照數據出現位置封裝到bean中
if (j == 0) {
Notes.setId(new Double(cellStr).intValue());
} else if (j == 1) {
Notes.setRuleId(new Double(cellStr).intValue());
} else if (j == 2) {
Notes.setMainId(new Double(cellStr).intValue());
}
}
NotesList.add(Notes);// 數據裝入List
}
} catch (IOException e) {
e.printStackTrace();
} finally {// 關閉文件流
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return NotesList;
}
}