1. 先说说导入
导入流程很简单,
第一步必须先知道文件在那 用一个标签 <s:file>即可解决
- <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <base href="<%=basePath%>">
- <title>My JSP 'exceltodatabase.jsp' starting page</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="This is my page">
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css">
- -->
- </head>
- <body>
- <s:form action="userInfo" method="post" enctype="multipart/form-data">
- 导入Excel文件:<s:file name="excelFile"></s:file> <br/>
- <s:submit value="导入"></s:submit>
- </s:form>
- </body>
- </html>
,在这里我用的是ACTION 都是自动赋值 所以无须接值 如果用Servlet 则将跳转路径修改 写一个方法 接收到FILE控件的值就OK 其他小细节就不说了。
核心部分在接收Excle行的数据,由于Excle的单元格式有很多种。 想让其插入到数据库,很有可能会出现数据格式不符合的问题。
比如: VO 的 username 字段属性是String 而Excle的单元格格式是数字 或者其他格式 那插入的过程就会出错 当初我是这样的想的 我全都设置成常规或者文本 将其转成String 再把String 转成VO的属性 但是失败了 后来 慢慢研究 发现了 其实影响数据不是只有 单元格格式。还有数据本身 怎么说呢 就是将数据过度到JAVA类的时候 就会发现 它会自己判断数据, 用这个方法getCellType获取数据格式 如果 username= 张三 getCellType=String 、 username=1233 getCellType=int、
那插入就会出错 不说了 贴代码。
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- import org.apache.poi.hssf.record.UserSViewBegin;
- 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 cn.ichina.bean.ExcelWorkSheet;
- import cn.ichina.bean.Userinfo;
- import com.opensymphony.xwork2.ActionSupport;
- /**
- * 导入的action
- * @author Administrator
- *
- */
- public class UserAction extends ActionSupport{
- private File excelFile; //上传的文件
- private String excelFileFileName; //保存原始文件名
- private ExcelWorkSheet<Userinfo> excelWorkSheet; //将Excel文件解析完毕后信息存放到这个对象中
- //判断文件类型
- public File getExcelFile() {
- return excelFile;
- }
- public void setExcelFile(File excelFile) {
- this.excelFile = excelFile;
- }
- public String getExcelFileFileName() {
- return excelFileFileName;
- }
- public void setExcelFileFileName(String excelFileFileName) {
- this.excelFileFileName = excelFileFileName;
- }
- public ExcelWorkSheet<Userinfo> getExcelWorkSheet() {
- return excelWorkSheet;
- }
- public void setExcelWorkSheet(ExcelWorkSheet<Userinfo> excelWorkSheet) {
- this.excelWorkSheet = excelWorkSheet;
- }
- public Workbook createWorkBook(InputStream is) throws IOException{
- if(excelFileFileName.toLowerCase().endsWith("xls")){
- return new HSSFWorkbook(is);
- }
- if(excelFileFileName.toLowerCase().endsWith("xlsx")){
- //return new XSSFWorkbook(is);
- }
- return null;
- }
- public String execute() throws Exception{
- System.out.println(excelFile);
- Workbook book = createWorkBook(new FileInputStream(excelFile));
- //book.getNumberOfSheets(); 判断Excel文件有多少个sheet
- Sheet sheet = book.getSheetAt(0);
- excelWorkSheet = new ExcelWorkSheet<Userinfo>();
- //保存工作单名称
- Row firstRow = sheet.getRow(0);
- Iterator<Cell> iterator = firstRow.iterator();
- //保存列名
- List<String> cellNames = new ArrayList<String>();
- while (iterator.hasNext()) {
- cellNames.add(iterator.next().getStringCellValue());
- }
- excelWorkSheet.setColumns(cellNames);
- //遍历
- for (int i = 1; i <= sheet.getLastRowNum(); i++) {
- Row ros = sheet.getRow(i);
- Iterator cells = ros.cellIterator();
- Userinfo user = new Userinfo();
- if(ros!=null){
- while (cells.hasNext()) {
- String valueString="";
- HSSFCell cell = (HSSFCell) cells.next();
- System.out.println("列:" + cell.getCellNum());
- switch (cell.getCellType()) {
- case HSSFCell.CELL_TYPE_NUMERIC: // 数字
- valueString=String.valueOf(cell.getNumericCellValue());
- System.out.println(cell.getNumericCellValue() + " 1 " );
- break;
- case HSSFCell.CELL_TYPE_STRING: // 字符串
- valueString=String.valueOf(cell.getStringCellValue());
- System.out.println(cell.getStringCellValue() + " 1 " );
- break;
- case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
- valueString=String.valueOf(cell.getBooleanCellValue());
- System.out.println(cell.getBooleanCellValue() + " 1 " );
- break;
- case HSSFCell.CELL_TYPE_FORMULA: // 公式
- valueString=String.valueOf(cell.getCellFormula());
- System.out.println(cell.getCellFormula() + " 1 " );
- break;
- case HSSFCell.CELL_TYPE_ERROR: // 故障
- System.out.println(" ");
- break;
- }
- switch (((int)cell.getCellNum()))//这是判断当前是第几行 {
- case 0: // 如果等于第一行,获取
- System.out.println("id="+valueString);
- break;
- case 1: // 如果等于第二行,获取
- user.setName(valueString);
- break;
- case 2: // 如果等于第三行,获取
- user.setPass(valueString);
- break;
- case 3: // 如果等于第四行,获取
- user.setLastname(valueString);
- break;
- case 4: // 如果等于第五行,获取
- user.setAddres(valueString);
- break;
- case 5: // 如果等于第六行,获取
- user.setRemark(valueString);
- break;
- }
- }}
- excelWorkSheet.getData().add(user);
- }
- for (int i = 0; i < excelWorkSheet.getData().size(); i++) {
- Userinfo info = excelWorkSheet.getData().get(i); // 如果需要插入数据库 则写插入遇见即可
- // System.out.println(info.getLastname());
- }
- return SUCCESS;
- }
- }
在这里 我用一个String 变量来接收所有的值 然后再将其设置VO 然后将VO设置进 excelWorkSheet的Data里 再用循环 赋值插入 这样导入就ok了。如果有很多行就多写几个case就ok了
2,Excle导出并生成一个Excle
导出很简单,但是有个问题。就是选择文件保存在那。 在这里我用的是下载的方式
如果用的是servlet 用 JFileChooser 选择保存路径即可 但是有个问题 客户端无法弹出
这个问题 我也不知道 求大神指教。
- JFileChooser jf=new JFileChooser(System.getProperty("user.dir"));//获取项目的路径
- System.out.println(System.getProperty("user.dir"));
- jf.setSelectedFile(new File("ExeclIreport.xls"));//设置默认
- jf.setDialogTitle("选择报表保存路径"); //自定义选择框标题
- jf.setFileFilter(new FileNameExtensionFilter("xls", "xls"));//设置文件格式
- int value=jf.showSaveDialog(null);
- if(value==JFileChooser.APPROVE_OPTION){ //判断窗口是否点的是打开或保存
- File getPath=jf.getSelectedFile(); } //取得路径
好了先说
第一步 点击按钮,链接进入方法
- public InputStream getDownloadFile() throws Exception{
- return this.getInputStream();
- }
- public InputStream getInputStream() {
- HSSFWorkbook wb=new HSSFWorkbook();
- HSSFSheet sheet=wb.createSheet("用户列表");
- // 设置表格样式
- HSSFCellStyle cellStyle = wb.createCellStyle();
- HSSFFont font = wb.createFont();
- font.setFontHeightInPoints((short)10); // 字体高度
- font.setColor(HSSFFont.COLOR_NORMAL); // 字体颜色
- font.setFontName( "宋体" );
- font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 宽度
- //font.setItalic( true ); // 是否使用斜体
- //font.setStrikeout(true); // 是否使用划线
- cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
- cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
- cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
- cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
- cellStyle.setFont(font);
- cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平布局:居中
- cellStyle.setWrapText(false);
- HSSFRow row=sheet.createRow(0);
- HSSFCell cell=row.createCell(0);
- cell.setCellStyle(cellStyle); // 设置单元格样式
- cell.setCellValue("序号");
- cell=row.createCell(1);
- cell.setCellStyle(cellStyle); // 设置单元格样式
- cell.setCellValue("姓名");
- cell=row.createCell(2);
- cell.setCellStyle(cellStyle); // 设置单元格样式
- cell.setCellValue("年龄");
- //如果是数据库的数据的话,用一个for循环就可以输出全部了
- row=sheet.createRow(1);
- cell=row.createCell(0);
- cell.setCellStyle(cellStyle);
- cell.setCellValue(1);
- cell=row.createCell(1);
- cell.setCellStyle(cellStyle);
- cell.setCellValue("张三");
- cell=row.createCell(2);
- cell.setCellStyle(cellStyle);
- cell.setCellValue("1221");
- ByteArrayOutputStream os = new ByteArrayOutputStream();
- try {
- wb.write(os);
- } catch (IOException e){
- e.printStackTrace();
- }
- byte[] content = os.toByteArray();
- InputStream is = new ByteArrayInputStream(content);
- return is;
- }
如果用数据库的数据:
scoresall=this.scoresdao.findAll(""); //查出需要导出的数据
//如果是数据库的数据的话,用一个for循环就可以输出全部了.
- for (int i = 0; i < scoresall.size(); i++) {
- tScores=scoresall.get(i);
- row=sheet.createRow(i+1);
- cell=row.createCell(0);
- cell.setCellStyle(cellStyle);
- cell.setCellValue(tScores.getExamname());
- cell=row.createCell(1);
- cell.setCellStyle(cellStyle);
- cell.setCellValue(tScores.getExamnumber() );
- cell=row.createCell(2);
- cell.setCellStyle(cellStyle);
- cell.setCellValue(tScores.getSubject());
- cell=row.createCell(3);
- cell.setCellStyle(cellStyle);
- cell.setCellValue(tScores.getExaminename());
- cell=row.createCell(4);
- cell.setCellStyle(cellStyle);
- cell.setCellValue(tScores.getGroupname());
- cell=row.createCell(5);
- cell.setCellStyle(cellStyle);
- cell.setCellValue(tScores.getFraction());
- }
然后执行方法返回 因为我这ACTION 只有一个方法 所以直接返回下载
- <action name="exportExcel" class="com.crd.action.ExportExcelAction">
- <result name="success" type="stream">
- <!-- 指定输出的为Excel文件 -->
- <param name="contentType">application/vnd.ms-excel</param>
- <!-- 类型是附件和指定下载时文件的默认名字 -->
- <param name="contentDisposition">p_w_upload;filename="Uaaaas.xls"</param>
- <!-- 这里的inputName的属性要和action里相应的get方法的名字对应。例如action的对应的方法名是getDownloadFile
- 所以这里用downloadFile -->
- <param name="inputName">downloadFile</param>
- </result>
- </action>
选择下载路径。OK
在这里小弟附上 源代码下载 http://down.51cto.com/data/502603
chenwei51制作 请尊重作者 转帖 注明原地址
感谢各位的观看 小弟 第一次写 技术文档 有什么不足 麻烦指出 在这里谢谢了