用POI将Mysql数据导入到Excel中去

用POI将Mysql数据导入到Excel中去,第1张

在我们实际的开发中 表现层的解决方案虽然有多样 但是IE浏览器已成为最多人使用的浏览器 因为大家都用Windows 在企业办公系统中 常常有客户这样子要求 你要把我们的报表直接用Excel打开 或者是 我们已经习惯用Excel打印 这样子如果开发是没有问题的用来进行这些数据导入导出支持的都是很好 如果你使用的是SQL Server数据库那就更方便了 笔者也曾体会开发这些功能的方便性 但是有j ee这个更有前途的开放式的开发环境 难道我为了解决打印的要求去另写客户端的控件?或者在服务器端使用本地代码?第一种方案的问题是关键数据的处理有时候不能在客户端做 第 种方案的问题是牺牲了代码的可移植性和稳定性 如果让客户端只负责处理生成好的报表 那将是一种诱人的选择

Apache的Jakata项目的POI子项目 目标是处理ole 对象 目前比较成熟的是HSSF接口 处理MS Excel( )对象 它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西 而是真正的Excel对象 你可以控制一些属性如sheet cell等等 这是一个年轻的项目 所以象HDF这样直接支持Word对象的好东西仍然在设计中 其它支持word格式的纯java方案还有itext 不过也是仍在奋斗中 但是HSSF已经成熟到能够和足够我们使用了 另外 无锡永中Office的实现方案也是纯java的解决方案 不过那也是完全商业的产品 并不是公开代码项目 其实 从开发历史的角度讲 在 年代中期starOffice的原作者在德国成立了StarOffice suite公司 然后到 年夏天starOffice被sun收购 再到 年 月starOffice 的发布 并且从starOffice 开始 starOffice建立在OpenOffice的api的基础上 这个公开代码的office项目已经进行了很长的时间 虽然那是由C++写的 但是POI的代码部分也是由openOffice改过来的 所以 应该对POI充满足够的信心 国内已经有部分公司在他们的办公自动化等Web项目中使用poi了 如日恒的ioffice 海泰的HTOffice等

java当初把核心处理设成Unicode 带来的好处是另代码适应了多语言环境 然而由于老外的英语只有 个字母 有些情况下 一些程序员用 位的byte处理 一不小心就去掉了CJK的高位 或者是由于习惯在程序中采用硬编码 还有多种原因 使得许多java应用在CJK的处理上很烦恼 还好在POI HSSF中考虑到这个问题 可以设置encoding为双字节

POI可以到下载到 编译好的jar主要有这样 个 poi包 poi Browser包 poi hdf包 poi hssf例程包 实际运行时 需要有poi包就可以了 如果用Jakarta ant编译和运行 下载apache Jakarta POI的release中的src包 它里面已经为你生成好了build文件了 只要运行ant就可以了(ant 的安装和使用在此不说了) 如果是用Jbuilder 运行 请在新建的项目中加入poi包 以Jbuilder 为例 选择Tools菜单项的config libraries 选项 新建一个lib 在d出的菜单中选择poi包 如这个jakarta poi final jar 把poi添加到jbuilder中 然后 右键点击你的项目 在project的properties菜单中path的required Libraries中 点add 添加刚才加入到jbuilder中的poi到你现在的项目中 如果你仅仅是为了熟悉POI hssf的使用 可以直接看POI的samples包中的源代码 并且运行它 hssf的各种对象都有例程的介绍 hssf提供的例程在 apache poi hssf usermodel examples包中 共有 个 生成的目标xls都是workbook xls 如果你想看更多的例程 可以参考hssf的Junit test cases 在poi的包的源代码中有 hssf都有测试代码

首先 到上去下载POI 登录到该网址以后 选择红 *** 域的poi bin final zip来下载

下载以后解压 解压目录为

在Eclipse中设置对poi bin final jar的库引用

在Eclipse中新建一个名字叫POIExcel的Java工程 右键POIExcel项目的项目名 选择Build Path 再选择Add External Archives 然后找到poi bin final jar这个包将其引进到工程中来

Excel 结构            HSSFWorkbook excell 文档对象介绍            HSSFSheet excell的表单            HSSFRow excell的行            HSSFCell excell的格子单元            HSSFFont excell字体            HSSFName 名称            HSSFDataFormat 日期格式            辅助 *** 作包括            HSSFDateUtil 日期            HSSFPrintSetup 打印            HSSFErrorConstants 错误信息表

将数据导出到Excel中的实例

创建一个空白的Excel文件

我们创建一个最普通的Java应用程序即可 程序代码如下:          HSSFWorkbook wb=new HSSFWorkbook()        FileOutputStream fileout = new FileOutputStream( C:\\test xls )        wb write(fileout)        fileout close()

FileOutputStream属于JDK的数据流对象 通过它来将一个名为test xls文件创建在C盘根目录下 运行该程序后可以看到在C盘上的根目录上多了一个Excel文件

如果将程序中的FileOutputStream( C:\\test xls )的参数改为 test xls 则文件就会创建在该项目的根目录下

往Excel的单元格中写入信息

POI把Excel分解成几个对象 自顶向下的关系是:工作薄(HSSFWorkbook) >表格(HSSFSheet) >表格行(HSSFRow) >单元格(HSSFCell) 将数据库中表的数据导入到Excel中 首先我们要将数据库中的表的数据查询出来 这里我们通过Hibernate来将数据库中addres *** ook_table表的数据查询出来 然后通过循环将表中的数据导入到Excel中去

HSSFWorkbook wb=new HSSFWorkbook()        HSSFSheet sheet=wb createSheet( new sheet )        try {        //通过Hibernate来查询addres *** ook_table表中的数据 将其存储在List中            Transaction tx = session beginTransaction()            hibernate Query query= session createQuery( from Addres *** ookTable )            List list = query list()            mit()            int k =         //创建表格 创建表格行和单元格 将数据库中表的字段存储在单元格中             for(Iterator it=erator()it hasNext()){                Addres *** ookTable user =(Addres *** ookTable)it next()                HSSFRow row=sheet createRow((short)k)                row createCell((short) ) setCellValue(user getId())                row createCell((short) ) setCellValue(user getName())                row createCell((short) ) setCellValue(user getAddress())                row createCell((short) ) setCellValue(user getPhone())                k++            }            FileOutputStream fileout = new FileOutputStream( C:\\test xls )            wb write(fileout)            fileout close()            log error( Successful!! )            } catch (HibernateException e) {                log error( Insert Exception! )                e printStackTrace()            }

lishixinzhi/Article/program/Oracle/201311/17278

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

直接全部在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.copyFile(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 = 1i <= totalRowi++) {

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()

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11884515.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存