javapoi導入
『壹』 java通過poi把excel文件導入mysql資料庫報錯
java通過poi把excel文件導入mysql資料庫報錯是因為excel中的數據類型要跟mysql中的數據類型和長度對應,否則類型轉換異常是最常見的。所以插入到mysql資料庫的時候需要做類型檢查。
1、Excel中的測試數據:
『貳』 java poi Excel大數據量導入怎麼提高速度
記得有個屬性,
POI3.8的SXSSF包是XSSF的一個擴展版本,支持流處理,在生成大數據量的電子表格且堆空間有限時使用。SXSSF通過限制內存中可訪問的記錄行數來實現其低內存利用,當達到限定值時,新一行神肢派數據的加入會引起老一行的數據刷新到硬碟。
比如內存中限制行數為100,當行號到達101時,行號為0的記錄刷新到硬碟並從內存中刪除,當行號到達102時,游賀行號為1的記錄刷新飢遲到硬碟,並從內存中刪除,以此類推。
rowAccessWindowSize代表指定的內存中緩存記錄數,默認為100,此值可以通過
new SXSSFWorkbook(int rowAccessWindowSize)或SXSSFSheet.setRandomAccessWindowSize(int windowSize)來設置。
『叄』 java使用什麼技術實現excel數據的批量導入導出
java使用第三方工具包POI技術實現excel數據的批量導入導出。
舉例如下:
1、下載apache的相關jar包。poi-ooxml-3.6.jar xmlbeans-2.3.0.jar等,如圖:
2、編寫相關的讀寫類
/**
* 讀取xls文件內容
*/
private
List<XlsDto> readXls() throws
IOException {
InputStream is = new
FileInputStream("test.xls");
HSSFWorkbook hssfWorkbook = new
HSSFWorkbook(is);
XlsDto xlsDto = null;
List<XlsDto> list = new
ArrayList<XlsDto>();
// 循環工作表Sheet
for
(int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if
(hssfSheet == null) {
continue;
}
// 循環行Row
for
(int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
HSSFRow hssfRow = hssfSheet.getRow(rowNum);
if
(hssfRow == null) {
continue;
}
xlsDto = new
XlsDto();
// 循環列Cell
// 0學號 1姓名 2學院 3課程名 4 成績
// for (int cellNum = 0; cellNum <=4; cellNum++) {
HSSFCell xh = hssfRow.getCell(0);
if
(xh == null) {
continue;
}
xlsDto.setXh(getValue(xh));
HSSFCell xm = hssfRow.getCell(1);
if
(xm == null) {
continue;
}
xlsDto.setXm(getValue(xm));
HSSFCell yxsmc = hssfRow.getCell(2);
if
(yxsmc == null) {
continue;
}
xlsDto.setYxsmc(getValue(yxsmc));
HSSFCell kcm = hssfRow.getCell(3);
if
(kcm == null) {
continue;
}
xlsDto.setKcm(getValue(kcm));
HSSFCell cj = hssfRow.getCell(4);
if
(cj == null) {
continue;
}
xlsDto.setCj(Float.parseFloat(getValue(cj)));
list.add(xlsDto);
}
}
return
list;
}
3、導出就是輸入到一個新的excel文件裡面
public void writeXls(List<Student> list, String path) throws Exception {
if (list == null) {原始數據為空,直接返回
return;
}
int countColumnNum = list.size();//設置列數
HSSFWorkbook book = new HSSFWorkbook(); //創建工作表對象
HSSFSheet sheet = book.createSheet("studentSheet");
// 創建第一行
HSSFRow firstRow = sheet.createRow(0);
HSSFCell[] firstCells = new HSSFCell[countColumnNum];
//創建表頭
String[] options = { "no", "name", "age", "score" };
//循環數據域
for (int j = 0; j < options.length; j++) {
firstCells[j] = firstRow.createCell(j);
firstCells[j].setCellValue(new HSSFRichTextString(options[j]));
}
//處理每一個cell的值
for (int i = 0; i < countColumnNum; i++) {
HSSFRow row = sheet.createRow(i + 1);
Student student = list.get(i);
for (int column = 0; column < options.length; column++) {
HSSFCell no = row.createCell(0);
HSSFCell name = row.createCell(1);
HSSFCell age = row.createCell(2);
HSSFCell score = row.createCell(3);
no.setCellValue(student.getNo());
name.setCellValue(student.getName());
age.setCellValue(student.getAge());
score.setCellValue(student.getScore());
}
}
File file = new File(path);
OutputStream os = new FileOutputStream(file);
System.out.println(Common.WRITE_DATA + path);
book.write(os);
os.close();
}
『肆』 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]
『伍』 java excel poi 怎麼導入
1、下載poi相關jar,maven的集成如下:(把${poi.version}替換成你要的版本)
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>${poi.version}</version>
<scope>provided</scope>
</dependency>
2、根據poi相關api讀取sheet、row、cell,獲得excel的數據:
封裝row的對象,即每一行數據為一個對象,每個cell為對象里的一個屬性,
整個sheet的數據裝進集合里;
3、處理數據,可以對數據進行驗證或其他操作;
4、寫資料庫操作。
『陸』 java我在用poi導入文件夾下的Excel時,導入了幾百條後,後台就報Stream closed,這是為什麼
1.把你的內存弄大點。
2.升級到POI3.8(新版本對解析效率有改進)。
3.導入,到處最好統一到POI來。
4.一定要找到內存溢出的原因!!!
5.先把你的測滲尺碰試數據弄少一點,或者看看你困銷的叢談Office版本。。。
『柒』 java利用poi技術導入批量excel數據,並且分段存入資料庫怎麼解決
注意引入的都是poi的包,使用Cell,excel2003的.xls對應是HSSFCell,而之後的xlsx對應的則是XSSFCell,但是他們都繼承於Cell,所以使用Cell就可以使用兩種格式的excel導入了,下面解決excel中數據的各種格式
[java] view plain
//讀取excel
try {
request.setCharacterEncoding("gbk");
response.setContentType("text/html;charset=gbk");
// 1. 創建工廠類
DiskFileItemFactory factory = new DiskFileItemFactory();
// 2. 創建FileUpload對象
ServletFileUpload upload = new ServletFileUpload(factory);
// 3. 判斷是否是上傳表單
// boolean b = upload.isMultipartContent(request);
// 設置上傳文件最大值
upload.setSizeMax(25 * 1024 * 1024);
// 是文件上傳表單
// 4. 解析request,獲得FileItem項
List<FileItem> fileitems = upload.parseRequest(request);
// 5. 遍歷集合
for (FileItem item : fileitems) {
// 判斷是不是普通欄位
if (!item.isFormField()) {
// 獲得流,讀取數據寫入文件
InputStream in = item.getInputStream();
Workbook book = createWorkBook(in,item.getName());
// 獲得第一個工作表對象
Sheet sheet = book.getSheetAt(0);
if(0==sheet.getLastRowNum()){
//如果沒有數據
request.setAttribute("message", "excel的sheet0中不存在數據");
request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response);
}
// 第一行為標題,從第二行開始錄入
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
//標題行,用來對比方便得到數據
Row titleRow = sheet.getRow(0);
//數據行
Row row = sheet.getRow(i);
//獲得值
String value_temp= this.getValue((Cell) row.getCell(2));
}
}
}
} catch (Exception e) {
e.printStackTrace();
message="導入失敗<br/>"+message;
request.setAttribute("message",message);
request.getRequestDispatcher("/cc/util/excelToData.jsp").forward(request, response);
}
『捌』 java POI 導入excel時候日期格式轉化
Java的不會,但是思路應該是差不瞎鄭多的,你數據為Null那你就用三元表達式判斷,慶卜如果為Null就賦一個值給它。(請自行網路三元表達式)磨差頌
『玖』 java用poi實現將資料庫裡面的數據導入已經存在的excel模板中。最好有實例參考,謝謝。
這是我之前寫的用反射的將數據導入到excel中的類,具體實現,代碼里有注釋。不知道樓主持久層用的什麼東東?如果是its,建議使用ibatis的rowhandler,導出部分的實現,和下面這個類也很類似,樓主自己改改吧,這樣性能會高一些,尤其是在你處理的要寫入文件的數據,比較多的情況下。
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
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.hssf.util.HSSFColor;
import org.apache.poi.ss.util.CellRangeAddress;
import cn.emag.framework.Util.LogName;
/**
* 導出成excel文件工具類
*/
public class Export2ExcelUtil
{
private static Logger log = Logger.getLogger(LogName.ERROR_LOG);
private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
/**
* 生成excel文件存入伺服器
* @param importdata 待導入excle文件的內容
* @param header excel」表頭「部分內容
* @param attr 與」表頭「順序對應的importdata中的成員變數名,首字母大寫
* @param fileName 導入到目標文件中,完整路徑
*/
public static void export2exc(List<Object> importdata,String[] header,String[] attr, String fileName)
{
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
// 創建頭文件
writeHeader(header,sheet,wb);
// 創建文件內容
int i=1;
HSSFRow row;
for(Object object:importdata)
{
row = sheet.createRow(i++);
writeBody(object, attr, row);
}
// 寫入文件
OutputStream os = null;
try
{
os = new FileOutputStream(fileName);
wb.write(os);
}
catch (Exception e)
{
log.error("寫入文件失敗",e);
}
finally
{
try
{
os.close();
}
catch (IOException e)
{
log.error("寫入文件失敗",e);
}
}
}
/**
* 創建文件頭
* @param header 頭內容
* @param sheet
*/
public static void writeHeader(String[] header,HSSFSheet sheet,HSSFWorkbook wb)
{
HSSFRow row = sheet.createRow(0);
HSSFCellStyle cellstype = wb.createCellStyle();
cellstype = wb.createCellStyle();
cellstype.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
cellstype.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
cellstype.setBorderBottom(HSSFCellStyle.BORDER_THIN);
cellstype.setBorderLeft(HSSFCellStyle.BORDER_THIN);
cellstype.setBorderRight(HSSFCellStyle.BORDER_THIN);
cellstype.setBorderTop(HSSFCellStyle.BORDER_THIN);
cellstype.setAlignment(HSSFCellStyle.ALIGN_CENTER);
HSSFCell cell;
HSSFRichTextString str;
int n = 0;
for (String head : header)
{
sheet.setColumnWidth(n, 4000);
cell = row.createCell(n++);
cell.setCellStyle(cellstype);
str = new HSSFRichTextString(head);
cell.setCellValue(str);
}
}
/**
* 寫行內容
* @param object
* @param atrr
* @param row
* @throws Exception
*/
public static void writeBody(Object object,String[] attr,HSSFRow row)
{
int n = 0;
HSSFCell cell;
Method method;
HSSFRichTextString str;
String content=null;
for(String atr : attr)
{
cell = row.createCell(n++);
try
{
method = object.getClass().getMethod("get"+atr);
Object o = method.invoke(object);
if(null!=o)
{
if(o instanceof Date)
{
content=format.format(o);
}else
{
content = String.valueOf( method.invoke(object));
}
}else
{
content=null;
}
}
catch (SecurityException e)
{
log.error("excel寫入單元格內容失敗",e);
}
catch (IllegalArgumentException e)
{
log.error("excel寫入單元格內容失敗",e);
}
catch (NoSuchMethodException e)
{
log.error("excel寫入單元格內容失敗",e);
}
catch (IllegalAccessException e)
{
log.error("excel寫入單元格內容失敗",e);
}
catch (InvocationTargetException e)
{
log.error("excel寫入單元格內容失敗",e);
}
str = new HSSFRichTextString(content);
cell.setCellValue(str);
}
}
}
『拾』 java poi導入excel第一次格式錯誤,改正後還是顯示錯誤
Word版本問題,Word分為2003和2007,需要分別做兼容處理