首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

知识库用户导入案例学习(应用poi包每次导入5W用户)

2012-09-12 
知识库用户导入案例学习(使用poi包每次导入5W用户)SIG项目中导入知识库的方法有很多种:1、RM9000 2、用户同

知识库用户导入案例学习(使用poi包每次导入5W用户)

SIG项目中导入知识库的方法有很多种:

1、RM9000
2、用户同步
3、用户自学习
4、SGMS的SOAP接口
5、UI界面添加、导入
6、绿网添加

了解的 几种解决方案:

1系统设计的规格是支持数据库相互之间导入 1000W-5000W用户 如果用户不便提供接口为了(从安全角度)先通过FTP 接受文件 变成CSV文件 然后再进行入库 大概需要1H

2从Excel 导入10-30W用户 设计规格是:每次导入5W 需要3-5分钟

  首先通过 org.apache.poi.hssf.usermodel.HSSF*   读取5W数据 逻辑校验后使用存储过程进行插入


下面提供poi 导入/读取Excel的两个两方法


    /**
* 将指定结构的数据存入到Excel文件中
* @throws IOException
*/
public void createExcel(List dataLst) throws IOException {
FileOutputStream fOut=null;
if(szFileName==null) {
return;
}
if(title==null || "".equals(title)) {
return;
}

if(colTitle.size()==0) {
return;
}

try {
// 创建新的Excel工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 在Excel工作簿中建一工作表,其名为缺省值
HSSFSheet sheet = workbook.createSheet();

//根据类名产成类
cls=Class.forName(className);

//写入TITLE
HSSFRow rowTitle=sheet.createRow(0);
HSSFCell cellTitle=rowTitle.createCell((short)(colTitle.size()/2));
cellTitle.setCellType(HSSFCell.CELL_TYPE_STRING);
cellTitle.setCellValue(title);

//写入Tip
            HSSFRow rowTip=sheet.createRow(1);
            HSSFCell cellTip=rowTip.createCell((short)0);
            cellTip.setCellType(HSSFCell.CELL_TYPE_STRING);
            cellTip.setCellValue(tips);

//写入每列TITLE
HSSFRow rowColTitle=sheet.createRow(2);
for(short i=0;i<colTitle.size();i++) {
HSSFCell cellColTitle=rowColTitle.createCell(i);
cellColTitle.setCellType(HSSFCell.CELL_TYPE_STRING);
cellColTitle.setCellValue(colTitle.get(i));
}


//写入内容,从第三行开始写入
Iterator it = dataLst.iterator();

int rowNumOfSheet = dataStartRow;
while (it.hasNext()) {
Object user = it.next();
Field[] fields = user.getClass().getDeclaredFields();

// 在索引rowNumOfSheet的位置创建行
HSSFRow row = sheet.createRow(rowNumOfSheet);

for (short cellNumOfRow = 0; cellNumOfRow < fields.length; cellNumOfRow++) {
//logger.debug("Input field "+Integer.toString(cellNumOfRow)+",name is:"+fields[cellNumOfRow].getName());

// 在索引cellNumOfRow的位置创建单元格
HSSFCell cell = row.createCell(cellNumOfRow);
// 定义单元格为字符串类型
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
fields[cellNumOfRow].setAccessible(true);
// 在单元格中输入内容
if( null != fields[cellNumOfRow].get(user)) {
cell.setCellValue(fields[cellNumOfRow].get(user).toString());
} else {
//必须写入一个空值,否则将出现不可预知的情况
cell.setCellValue("");
}

}
rowNumOfSheet++;
}

// 新建一输出文件流
fOut = new FileOutputStream(szFileName);

// 把相应的Excel 工作簿存盘
workbook.write(fOut);
fOut.flush();
// 操作结束,关闭文件
} catch (Exception e) {
    if(e instanceof RuntimeException){
                throw (RuntimeException)e;
            }else{
                IOException ie = new IOException();
                ie.initCause(e);
                throw ie;
            }
} finally {
if(fOut!=null) {
fOut.close();
}
}
}





    /**
*
* 读取excel,遍历各个小格获取其中信息
* @throws IOException
*
*/
public void readExcel() throws IOException {
DecimalFormat df = new DecimalFormat("#");
String strCell=null;
FileInputStream inputFile=null;

if(szFileName!=null) {
inputFile=new FileInputStream(szFileName);
} else {
return;
}

try {
cls=Class.forName(className);
users = new ArrayList();


// 创建对Excel工作簿文件的引用
HSSFWorkbook workbook = new HSSFWorkbook(inputFile);
/**
* 获取sheet的个数 workbook.getNumberOfSheets()
*/
for (int numSheets = 0; numSheets < workbook.getNumberOfSheets(); numSheets++) {
if (null != workbook.getSheetAt(numSheets)) {
HSSFSheet aSheet = workbook.getSheetAt(numSheets);// 获得一个sheet

/* 检查器存在,则检查格式 */
if(checker != null && numSheets == 0){
    HSSFRow _row = aSheet.getRow(dataStartRow - 1);
    checker.check(_row);
    checker.check(aSheet);
}

boolean flag = false;
for (int rowNumOfSheet = dataStartRow; rowNumOfSheet <= aSheet.getLastRowNum(); rowNumOfSheet++) {
if (null != aSheet.getRow(rowNumOfSheet)) {
HSSFRow aRow = aSheet.getRow(rowNumOfSheet);

//创建类cls的实例
Object user =  cls.newInstance();
Field[] fields = user.getClass().getDeclaredFields();

for (short cellNumOfRow = 0; cellNumOfRow < fields.length; cellNumOfRow++) {
fields[cellNumOfRow].setAccessible(true);
if (null != aRow.getCell(cellNumOfRow)) {
HSSFCell aCell = aRow.getCell(cellNumOfRow);
int cellType = aCell.getCellType();
switch (cellType) {
case 0:// Numeric
strCell = df.format(aCell.getNumericCellValue());
break;

case 1:// String
strCell = aCell.getStringCellValue();
break;

default:
strCell="";
}
// 修改问题单A06D18405,modified by suliming 20091109 begin
if(strCell != null){
strCell = strCell.trim();
}
// 修改问题单A06D18405,modified by suliming 20091109 end
if(!"".equalsIgnoreCase(strCell))
                                    {
                                        flag = true;
                                    }
BeanUtils.setProperty(user, fields[cellNumOfRow].getName(), strCell);

}
}
if(flag)
{
                        users.add(user);
                        flag = false;
}
}
}
}
}
} catch (Exception e) {
    if(e instanceof RuntimeException){
        throw (RuntimeException)e;
    }else{
        IOException ie = new IOException();
        ie.initCause(e);
        throw ie;
    }
} finally {
inputFile.close();
}


return;
}

热点排行