Java 将excel中的内容导入数据库中

ExcelReader类,用来从excel中读取数据的,网上版本的修改版。

 

 

[c-sharp] view plain copy
  1. package dataDML;  
  2.   
  3. import java.io.IOException;      
  4. import java.io.InputStream;      
  5. import java.text.DateFormat;  
  6. import java.text.SimpleDateFormat;  
  7. import java.util.Date;        
  8.      
  9. import org.apache.poi.hssf.usermodel.HSSFCell;      
  10. import org.apache.poi.hssf.usermodel.HSSFDateUtil;  
  11. import org.apache.poi.hssf.usermodel.HSSFRow;      
  12. import org.apache.poi.hssf.usermodel.HSSFSheet;      
  13. import org.apache.poi.hssf.usermodel.HSSFWorkbook;      
  14. import org.apache.poi.poifs.filesystem.POIFSFileSystem;     
  15.   
  16.     /**    
  17.      * 操作Excel表格的功能类    
  18.      * @author:   
  19.      * @version    
  20.      */     
  21.     public class ExcelReader {      
  22.         private POIFSFileSystem fs;      
  23.         private HSSFWorkbook wb;      
  24.         private HSSFSheet sheet;      
  25.         private HSSFRow row;      
  26.         /**    
  27.          * 读取Excel表格表头的内容    
  28.          * @param InputStream    
  29.          * @return String 表头内容的数组    
  30.          *     
  31.          */     
  32.         public String[] readExcelTitle(InputStream is) {      
  33.             try {      
  34.                 fs = new POIFSFileSystem(is);      
  35.                 wb = new HSSFWorkbook(fs);      
  36.             } catch (IOException e) {      
  37.                 e.printStackTrace();      
  38.             }      
  39.             sheet = wb.getSheetAt(0);      
  40.             row = sheet.getRow(0);      
  41.             //标题总列数      
  42.             int colNum = row.getPhysicalNumberOfCells();      
  43.             String[] title = new String[colNum];      
  44.             for (int i=0; i<colNum; i++) {      
  45.                 title[i] = getTitleValue(row.getCell((short) i));      
  46.             }      
  47.             return title;      
  48.         }      
  49.    
  50.               
  51.         /**    
  52.          * 获取单元格数据内容为字符串类型的数据    
  53.          * @param cell Excel单元格    
  54.          * @return String 单元格数据内容,若为字符串的要加单引号    
  55.          */     
  56.         public String getStringCellValue(HSSFCell cell) {      
  57.             String strCell = "";      
  58.             switch (cell.getCellType()) {      
  59.             case HSSFCell.CELL_TYPE_STRING:      
  60.                 strCell = "'" + cell.getStringCellValue() + "'";      
  61.                 break;      
  62.             case HSSFCell.CELL_TYPE_NUMERIC:      
  63.                     
  64.                    strCell = String.valueOf(cell.getNumericCellValue());     
  65.                 }    
  66.                 break;      
  67.             case HSSFCell.CELL_TYPE_BOOLEAN:      
  68.                 strCell = String.valueOf(cell.getBooleanCellValue());      
  69.                 break;      
  70.             case HSSFCell.CELL_TYPE_BLANK:      
  71.                 strCell = "''";      
  72.                 break;     
  73.             default:      
  74.                 strCell = "''";      
  75.                 break;      
  76.             }      
  77.             if (strCell.equals("''") || strCell == null) {      
  78.                 return "";      
  79.             }      
  80.             if (cell == null) {      
  81.                 return "";      
  82.             }      
  83.             return strCell;      
  84.         }      
  85.           
  86.         public String getTitleValue(HSSFCell cell) {      
  87.             String strCell =  cell.getStringCellValue();      
  88.             return strCell;      
  89.         }      
  90.               
  91.     }  

 

 

下面是利用这个类读取数据并存储到已有的数据表中,这里要注意的一点是,从excel中读取的日期数据,除非是以文本形式存储的,取得的数据都不是日期形式,而是数字,是该日期距离1900年1月日的天数,为了能够正确存储到数据库中,我对该数据所对应的字段名进行了判断,如果包含"date",也就是日期字段的数据,就对其进行转化。具体见下面代码:

 

[c-sharp] view plain copy
  1. package dataDML;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.sql.Connection;  
  8. import java.sql.Date;  
  9. import java.sql.DriverManager;  
  10. import java.sql.PreparedStatement;  
  11. import java.sql.SQLException;  
  12. import java.text.DateFormat;  
  13. import java.text.SimpleDateFormat;  
  14.   
  15. import org.apache.poi.hssf.usermodel.HSSFRow;  
  16. import org.apache.poi.hssf.usermodel.HSSFSheet;  
  17. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  18. import org.apache.poi.poifs.filesystem.POIFSFileSystem;  
  19.   
  20. public class DataInsert {  
  21.   
  22.     public static String driver = "com.mysql.jdbc.Driver";  
  23.     public static String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8";//之所以链接地址后面会添加参数,是为了防止中文乱码  
  24.     public static Connection conn;  
  25.       
  26.     public static void main(String[] args) {  
  27.                 try {  
  28.                     Class.forName(driver);  
  29.                     conn = DriverManager.getConnection(url,"test""test123");  
  30.                     insertData("tbname");//tbname,为要插入的数据表名  
  31.                 } catch (ClassNotFoundException e) {  
  32.                     // TODO Auto-generated catch block  
  33.                     e.printStackTrace();  
  34.                 } catch (SQLException e) {  
  35.                     // TODO Auto-generated catch block  
  36.                     e.printStackTrace();  
  37.                 }  
  38.                   
  39.   
  40.     }  
  41.       
  42.     public static void insertData(String tbName){  
  43.         try {  
  44.                           
  45.             //casilin:插入数据,先从excel中读取数据  
  46.             InputStream is = new FileInputStream("D://test.xls");  
  47.             ExcelReader excelReader = new ExcelReader();  
  48.             String[] colName = excelReader.readExcelTitle(is);  
  49.               
  50.             //开始建立插入的sql语句,每一次插入的开头都是不变的,都是字段名  
  51.             StringBuffer sqlBegin = new StringBuffer("insert into " + tbName + "(");  
  52.             //获取字段名,并添加入sql语句中  
  53.             for (int i = 0; i < colName.length; i ++){  
  54.                 sqlBegin.append(colName[i]);  
  55.                 if (i != colName.length -1) {  
  56.                     sqlBegin.append(",");  
  57.                 }  
  58.             }  
  59.             sqlBegin.append(") values(");  
  60.             is.close();  
  61.               
  62.             //下面读取字段内容  
  63.             POIFSFileSystem fs;  
  64.             HSSFWorkbook wb;  
  65.             HSSFSheet sheet;  
  66.             HSSFRow row;  
  67.                 
  68.             is = new FileInputStream("D://casilin//testFiles//test.xls");  
  69.             fs = new POIFSFileSystem(is);      
  70.             wb = new HSSFWorkbook(fs);    
  71.             sheet = wb.getSheetAt(0);  
  72.                   
  73.             //得到总行数      
  74.             int rowNum = sheet.getLastRowNum();      
  75.             row = sheet.getRow(0);      
  76.             int colNum = row.getPhysicalNumberOfCells();      
  77.             //正文内容应该从第二行开始,第一行为表头的标题      
  78.             String sql = new String(sqlBegin);  
  79.             String temp;  
  80.             for (int i = 1; i <= rowNum; i++) {      
  81.                 row = sheet.getRow(i);      
  82.                 int j = 0;      
  83.                 while (j<colNum) {         
  84.                     temp = excelReader.getStringCellValue(row.getCell((short) j)).trim();  
  85.                       
  86.                     //日期的特殊处理  
  87.                     if (colName[j].indexOf("date") != -1){  
  88.                         temp = temp.substring(0, temp.length()-2);  
  89.                         //excel是以1990年为基数的,而java中的date是以1970年为基数的。所以要扣除差 25569天  
  90.                         Date d = new Date((Long.valueOf(temp) - 25569) * 24 * 3600 * 1000);  
  91.                         DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");  
  92.                         temp = "'" + formater.format(d) + "'";  
  93.                     }  
  94.                       
  95.                     sql = sql + temp;  
  96.                     if (j != colNum-1){  
  97.                         sql = sql + ",";  
  98.                     }  
  99.                     j ++;      
  100.                 }         
  101.                 sql = sql + ")";  
  102.                 System.out.println(sql.toString());  
  103.                 PreparedStatement ps = conn.prepareStatement(sql.toString());  
  104.                 ps.execute();  
  105.                 ps.close();  
  106.                 sql = "";  
  107.                 sql = sqlBegin.toString();  
  108.             }  
  109.               
  110.         }  catch (FileNotFoundException e) {  
  111.             // TODO Auto-generated catch block  
  112.             e.printStackTrace();  
  113.         }  catch (IOException e) {      
  114.             e.printStackTrace();      
  115.         } catch (SQLException e) {  
  116.             // TODO Auto-generated catch block  
  117.             e.printStackTrace();  
  118.         }      
  119.     }  
  120.       
  121.   
  122.   
  123. }  
                     

 

这里会用到一个Jar包:poi.jar,自己可以到网上搜一下,我就不提供地址了。



转载自:http://blog.csdn.net/casilin/article/details/5750773

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值