导出_导出excel - CSDN
  • excel 导出

    2019-01-30 09:26:20
    excel 导出,在项目使用中十分广泛,本文讲解如何导出 excel 本文使用 springboot + mybatis 框架 yml 配置文件如下 server: port: 9001 spring: datasource: url: jdbc:mysql://105.42.21.92:3306/orcl?...

    excel 导出,在项目使用中十分广泛,本文讲解如何导出 excel

    本文使用 springboot + mybatis 框架

    yml 配置文件如下

    server:
      port:  9001
      
    spring:
      datasource:
        url:  jdbc:mysql://105.42.21.92:3306/orcl?useUnicode=true&characterEncoding=utf-8&useSSL=false
        driver-class-name:  com.mysql.jdbc.Driver  
        username:  root
        password:  123456 
        
    mybatis:
      mapper-locations:  classpath:mapper/*Mapper.xml
      config-location:  classpath:mapper/config/sqlMapConfig.xml     

     

    1、首先在项目中引入 poi jar包,本文使用 poi 解析2003以下版本

    <!--poi对excel2003以下版本的支持-->  
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.17</version>
    </dependency>

    2、数据库表结构及表中数据如下

    建表及添加数据 sql 语句

    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for user
    -- ----------------------------
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `user_id` double DEFAULT NULL,
      `user_name` varchar(64) DEFAULT NULL,
      `age` int(11) DEFAULT NULL,
      `user_addr` varchar(64) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of user
    -- ----------------------------
    INSERT INTO `user` VALUES ('1', '贾宝玉', '16', '怡红院');
    INSERT INTO `user` VALUES ('2', '林黛玉', '16', '潇湘馆');
    INSERT INTO `user` VALUES ('3', '薛宝钗', '17', '衡芜院');
    INSERT INTO `user` VALUES ('4', '妙玉', '18', '栊翠庵');
    INSERT INTO `user` VALUES ('5', '史湘云', '16', '藕香榭');
    INSERT INTO `user` VALUES ('1', '唐三藏', '26', '长安');
    INSERT INTO `user` VALUES ('2', '孙悟空', '526', '花果山');
    INSERT INTO `user` VALUES ('3', '猪八戒', '700', '高老庄');
    INSERT INTO `user` VALUES ('4', '沙悟净', '800', '流沙河');
    INSERT INTO `user` VALUES ('5', '黑熊精', '1000', '黑风洞');
    INSERT INTO `user` VALUES ('6', '金角', null, '金山');
    INSERT INTO `user` VALUES ('7', null, '1000', '金山');

     

    3、实体类如下

    package com.demo.bean;
    
    public class User {
    	
    	private double userId;
    	
    	private String userName;
    	
    	private Integer age;
    	
    	private String userAddr;
    
    	public double getUserId() {
    		return userId;
    	}
    
    	public void setUserId(double userId) {
    		this.userId = userId;
    	}
    
    	public String getUserName() {
    		return userName;
    	}
    
    	public void setUserName(String userName) {
    		this.userName = userName;
    	}
    
    	public Integer getAge() {
    		return age;
    	}
    
    	public void setAge(Integer age) {
    		this.age = age;
    	}
    
    	public String getUserAddr() {
    		return userAddr;
    	}
    
    	public void setUserAddr(String userAddr) {
    		this.userAddr = userAddr;
    	}
    
    	@Override
    	public String toString() {
    		return "User [userId=" + userId + ", userName=" + userName + ", age=" + age + ", userAddr=" + userAddr + "]";
    	}
    }
    

    4、mapper 层如下

    package com.demo.mapper;
    
    import java.util.List;
    import org.apache.ibatis.annotations.Mapper;
    import com.demo.bean.User;
    
    @Mapper
    public interface UserMapper {
    	
    	//批量将数据添加到数据库
    	int insertForeach(List<User> list);
    	
    	List<User> getAllUserList();
    
    }
    

    5、mapper.xml 文件如下

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="com.demo.mapper.UserMapper">
    
        <insert id="insertForeach" parameterType="java.util.List" useGeneratedKeys="false">
            insert into user ( user_id, user_name, age, user_addr) values
            <foreach collection="list" item="item" index="index" separator=",">
                (#{item.userId}, #{item.userName}, #{item.age}, #{item.userAddr})
            </foreach>		
        </insert>   
        
        <resultMap id="ResultMap" type="com.demo.bean.User">
            <id column="user_id" property="userId" jdbcType="DOUBLE" />
            <result column="user_name" property="userName" jdbcType="VARCHAR" />
            <result column="age" property="age" jdbcType="INTEGER" />
            <result column="user_addr" property="userAddr" jdbcType="VARCHAR" />
        </resultMap>
        
        <select id="getAllUserList" resultMap="ResultMap">
            select * from user
        </select> 
    </mapper>
    

    6、controller 层代码如下

    package com.demo.controller;
    
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    import java.util.List;
    import javax.servlet.http.HttpServletResponse;
    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.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    import com.demo.bean.User;
    import com.demo.mapper.UserMapper;
    
    @Controller
    public class ExcelExportController {
    	
    	@Autowired
    	private UserMapper userMapper;
    	
    	@RequestMapping("/export")
    	public ModelAndView exportIndex() {
    		ModelAndView mav = new ModelAndView();
    		mav.setViewName("export");
    		return mav;
    	}
    	
    	@RequestMapping("/exportExcel")
    	public void exportExcel(String fileName, HttpServletResponse response) {
    		List<User> list = userMapper.getAllUserList();
    		
    		Workbook wb = new HSSFWorkbook();  //定义一个新的工作簿
    		Sheet sheet = wb.createSheet("sheet的名字");  //设置sheet名称
    		
    		//设置表头
    		Row header = sheet.createRow(0);
    		for(int k=0; k<4; k++) {
    			Cell cell = header.createCell(k);
    			if(k == 0) {
    				cell.setCellValue("ID");
    			}
    			if(k == 1) {
    				cell.setCellValue("姓名");
    			}
    			if(k == 2) {
    				cell.setCellValue("年龄");
    			}
    			if(k == 3) {
    				cell.setCellValue("地址");
    			}
    		}
    		
    		
    		for(int i=0; i<list.size(); i++) {
    			Row row = sheet.createRow(i+1);  //i+1 是从表头的下一行开始
    			
    			for(int j=0; j<4; j++) {
    				Cell cell = row.createCell(j);
    				
    				if(j == 0) {
    					cell.setCellValue(list.get(i).getUserId());
    				}
    				if(j == 1) {
    					//判断 list.get(i).getUserName() 为空的情况
    					if("".equals(list.get(i).getUserName())) {
    						//如果为空,设置默认值
    						cell.setCellValue("");
    					}else {
    						cell.setCellValue(list.get(i).getUserName());
    					}
    				}
    				if(j == 2) {
    					//判断 list.get(i).getAge() 为空的情况
    					if(null == list.get(i).getAge()) {
    						//如果为空,设置默认值
    						cell.setCellValue(0);
    					}else {
    						cell.setCellValue(list.get(i).getAge());
    					}
    					
    				}
    				if(j == 3) {
    					cell.setCellValue(list.get(i).getUserAddr());
    				}
    			}
    		}
    		
    		String webFileName;
    		try {
    			webFileName = URLEncoder.encode(fileName, "UTF-8");//解决浏览器下载中文乱码问题
    			response.setContentType("application/octet-stream");
    		    response.setHeader("Content-disposition", "attachment;filename="+webFileName+".xls");//Excel文件名
    			
    		} catch (UnsupportedEncodingException e1) {
    			e1.printStackTrace();
    		}
    		
    	    try {
    			wb.write(response.getOutputStream());
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }
    

    7、创建 export.ftl 页面文件

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>excel导出</title>
    </head>
    <body>
    
    	<form action="/exportExcel">
    	     <input type="text" name="fileName" />
    	     <input type="submit" value="下载" />
    	</form>
         
    </body>
    </html>

    8、测试

    浏览器访问  http://localhost:9001/export

    随意输入 excel 的文件名,点击下载

    打开 excel 文件

     

     

     

    如果要解析 excel2007以上版本示例如下

    先引入 jar 包

    <!--poi对excel2007以上版本的支持-->  
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.17</version>
    </dependency>

    controller 层代码如下

    package com.demo.controller;
    
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    import java.util.List;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    import com.demo.bean.User;
    import com.demo.mapper.UserMapper;
    
    @Controller
    public class Excel2007Controller {
    	
    	@Autowired
    	private UserMapper userMapper;
    	
    	@RequestMapping("/excel2007")
    	public ModelAndView excel2007() {
    		ModelAndView mav = new ModelAndView();
    		mav.setViewName("excel2007");
    		return mav;
    	}
    	
    	@RequestMapping("/exportExcel2007")
    	public void exportExcel2007(String fileName, HttpServletResponse response) {
    		List<User> list = userMapper.getAllUserList();
    		
    		XSSFWorkbook xwb = new XSSFWorkbook();
    		XSSFSheet xsheet = xwb.createSheet("自定义sheet名称");
    		
    		XSSFRow xheader = xsheet.createRow(0);
    		for(int i=0; i<4; i++) {
    			XSSFCell xcell = xheader.createCell(i);
    			if(i == 0) {
    				xcell.setCellValue("ID");
    			}
    			if(i == 1) {
    				xcell.setCellValue("姓名");
    			}
    			if(i == 2) {
    				xcell.setCellValue("年龄");
    			}
    			if(i == 3) {
    				xcell.setCellValue("地址");
    			}
    		}
    		
    		for(int i=0; i<list.size(); i++) {
    			XSSFRow xrow = xsheet.createRow(i+1);
    			
    			
    			for(int j=0; j<4; j++) {
    				XSSFCell xcell = xrow.createCell(j);
    				
    				if(j == 0) {
    					xcell.setCellValue(list.get(i).getUserId());
    				}
    				
    				if(j == 1) {
    					//判断 list.get(i).getUserName() 为空的情况
    					if("".equals(list.get(i).getUserName())) {
    						//如果为空,设置默认值
    						xcell.setCellValue("");
    					}else {
    						xcell.setCellValue(list.get(i).getUserName());
    					}
    				}
    				
    				if(j == 2) {
    					//判断 list.get(i).getAge() 为空的情况
    					if(null == list.get(i).getAge()) {
    						//如果为空,设置默认值
    						xcell.setCellValue(0);
    					}else {
    						xcell.setCellValue(list.get(i).getAge());
    					}
    				}
    				
    				if(j == 3) {
    					xcell.setCellValue(list.get(i).getUserAddr());
    				}
    			}
    		}
    		
    		String webFileName;
    		try {
    			webFileName = URLEncoder.encode(fileName, "UTF-8");//解决浏览器下载中文乱码问题
    			response.setContentType("application/octet-stream");
    		    response.setHeader("Content-disposition", "attachment;filename="+webFileName+".xlsx");//Excel文件名
    			
    		} catch (UnsupportedEncodingException e1) {
    			e1.printStackTrace();
    		}
    		
    	    try {
    			xwb.write(response.getOutputStream());
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		
    	}
    
    }
    

    ftl 页面如下

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>excel2007导出</title>
    </head>
    <body>
    	 <form action="/exportExcel2007">
    	     <input type="text" name="fileName" />
    	     <input type="submit" value="下载" />
    	 </form>
    </body>
    </html>

     

    展开全文
  • java导出excel的两种方式

    万次阅读 多人点赞 2019-04-05 10:24:31
    一、在后台实现,利用java的poi 1、导入jar包,需要导入lib文件夹下如下包: poi-3.11-20141221.jar poi-ooxml.jar poi-ooxml-schemas.jar 2、在util下写一个公共类,该类主要利用Jakarta POI HSSF API组件(用于...

    在这里插入图片描述
    一、在后台实现,利用java的poi
    1、导入jar包,需要导入lib文件夹下如下包:
    poi-3.11-20141221.jar
    poi-ooxml.jar
    poi-ooxml-schemas.jar
    2、在util下写一个公共类,该类主要利用Jakarta POI HSSF API组件(用于操作Excel的组件),主要部分包括Excel对象,样式和格式,还有辅助操作。

     常用组件:
        HSSFWorkbook        excel的文档对象
        HSSFSheet           excel的表单
        HSSFRow             excel的行
        HSSFCell            excel的格子单元
        HSSFFont            excel字体
        HSSFDataFormat      日期格式
        HSSFHeader         sheet头
        HSSFFooter         sheet尾(只有打印的时候才能看到效果)
    
        样式:
        HSSFCellStyle                       cell样式
        辅助操作包括:
        HSSFDateUtil                        日期
        HSSFPrintSetup                      打印
        HSSFErrorConstants                  错误信息表
    

    3、该类的操作代码如下:

    package com.bdqn.util;
    
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFFont;
    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;
    
    public class ExportExcel {
    
      // 显示的导出表的标题
      private String title;
      // 导出表的列名
      private String[] rowName;
      private List<Object[]> dataList = new ArrayList<Object[]>();
    
      // 构造函数,传入要导出的数据
      public ExportExcel(String title, String[] rowName, List<Object[]> dataList) {
        this.dataList = dataList;
        this.rowName = rowName;
        this.title = title;
      }
    
      // 导出数据
      public void export(OutputStream out) throws Exception {
        try {
          HSSFWorkbook workbook = new HSSFWorkbook();
          HSSFSheet sheet = workbook.createSheet(title);
    
          // 产生表格标题行
          HSSFRow rowm = sheet.createRow(0);
          HSSFCell cellTitle = rowm.createCell(0);
          
          
          //sheet样式定义【】
          HSSFCellStyle columnTopStyle=this.getColumnTopStyle(workbook);
          HSSFCellStyle style=this.getStyle(workbook);
          sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (rowName.length - 1)));
          cellTitle.setCellStyle(columnTopStyle);
          cellTitle.setCellValue(title);
    
          // 定义所需列数
          int columnNum = rowName.length;
          HSSFRow rowRowName = sheet.createRow(2);
    
          // 将列头设置到sheet的单元格中
          for (int n = 0; n < columnNum; n++) {
            HSSFCell cellRowName = rowRowName.createCell(n);
            cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING);
            HSSFRichTextString text = new HSSFRichTextString(rowName[n]);
            cellRowName.setCellValue(text);
            cellRowName.setCellStyle(columnTopStyle);
    
          }
          // 将查询到的数据设置到sheet对应的单元格中
          for (int i = 0; i < dataList.size(); i++) {
            Object[] obj = dataList.get(i);// 遍历每个对象
            HSSFRow row = sheet.createRow(i + 3);// 创建所需的行数
    
            for (int j = 0; j < obj.length; j++) {
              HSSFCell cell = null;
              if (j == 0) {
                cell = row.createCell(j, HSSFCell.CELL_TYPE_NUMERIC);
                cell.setCellValue(i + 1);
              } else {
                cell = row.createCell(j, HSSFCell.CELL_TYPE_STRING);
                if (!"".equals(obj[j]) && obj[j] != null) {
                  cell.setCellValue(obj[j].toString());
                }
              }
              cell.setCellStyle(style);
    
            }
    
          }
    
          // 让列宽随着导出的列长自动适应
          for (int colNum = 0; colNum < columnNum; colNum++) {
            int columnWidth = sheet.getColumnWidth(colNum) / 256;
            for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
              HSSFRow currentRow;
              if (sheet.getRow(rowNum) == null) {
                currentRow = sheet.createRow(rowNum);
              } else {
                currentRow = sheet.getRow(rowNum);
              }
              if (currentRow.getCell(colNum) != null) {
                HSSFCell currentCell = currentRow.getCell(colNum);
                if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
                  int length = currentCell.getStringCellValue().getBytes().length;
                  if (columnWidth < length) {
                    columnWidth = length;
                  }
                }
              }
            }
            if (colNum == 0) {
              sheet.setColumnWidth(colNum, (columnWidth - 2) * 256);
            } else {
              sheet.setColumnWidth(colNum, (columnWidth + 4) * 256);
            }
          }
    
          if (workbook != null) {
            try {
    
              workbook.write(out);
    
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
    
        } catch (Exception e) {
    
        }
      }
    

    4、单元格样式:

    /*
       * 列头单元格样式
       */
      public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {
        // 设置字体
        HSSFFont font = workbook.createFont();
    
        // 设置字体大小
        font.setFontHeightInPoints((short) 11);
        // 字体加粗
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        // 设置字体名字
        font.setFontName("Courier New");
        // 设置样式
        HSSFCellStyle style = workbook.createCellStyle();
        // 设置低边框
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        // 设置低边框颜色
        style.setBottomBorderColor(HSSFColor.BLACK.index);
        // 设置右边框
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        // 设置顶边框
        style.setTopBorderColor(HSSFColor.BLACK.index);
        // 设置顶边框颜色
        style.setTopBorderColor(HSSFColor.BLACK.index);
        // 在样式中应用设置的字体
        style.setFont(font);
        // 设置自动换行
        style.setWrapText(false);
        // 设置水平对齐的样式为居中对齐;
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        return style;
    
      }
    
      public HSSFCellStyle getStyle(HSSFWorkbook workbook) {
        // 设置字体
        HSSFFont font = workbook.createFont();
        // 设置字体大小
        font.setFontHeightInPoints((short) 10);
        // 字体加粗
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        // 设置字体名字
        font.setFontName("Courier New");
        // 设置样式;
        HSSFCellStyle style = workbook.createCellStyle();
        // 设置底边框;
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        // 设置底边框颜色;
        style.setBottomBorderColor(HSSFColor.BLACK.index);
        // 设置左边框;
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        // 设置左边框颜色;
        style.setLeftBorderColor(HSSFColor.BLACK.index);
        // 设置右边框;
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        // 设置右边框颜色;
        style.setRightBorderColor(HSSFColor.BLACK.index);
        // 设置顶边框;
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        // 设置顶边框颜色;
        style.setTopBorderColor(HSSFColor.BLACK.index);
        // 在样式用应用设置的字体;
        style.setFont(font);
        // 设置自动换行;
        style.setWrapText(false);
        // 设置水平对齐的样式为居中对齐;
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // 设置垂直对齐的样式为居中对齐;
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        return style;
      }
    

    5、前台主要代码如下:
    5.1 第一种,我们没有传入页面的查询参数,到后台我们无论怎么查询,都是把整个数据库不分条件的全部导出。不能够满足用户需求,体验不好,不推荐。

      <button type="button" class="btn btn-success" id="delPro" "dao()">导出Excel</button>
    function dao() {
      location.href="MedicineAdminServlet?a=dao&pageon="+${page.pageon};
    }
    

    5、2第二种,我们往后台传入时,把查询的参数一并传入后台,后台接收后作为条件去数据库找符合条件的,查到符合条件的导出,比较人性化。

    <a href="SendMedicineServlet?a=dao&patientid=${param.patientid }&prescriptionid=${param.prescriptionid}&patientname=${param.patientname }&starttime=${param.starttime }&endtime=${param.endtime }">
              <button type="button" class="btn btn-success" id="delPro">导出Excel</button>
              </a>
    

    6、为了方便读者理解,前端页面如下:查询条件为病历号,姓名等,会根据曾经的查询条件导出。

    在这里插入图片描述

    7、后台servlet操作主要代码如下:(传入当前页将会只打印当前页)

    /**
         * 导出excel文件
         */
    
    else if (a.equals("dao")) {
      String patientid = request.getParameter("patientid");
      int patientid3 = 0;
      if (patientid != null && !patientid.equals("")) {
        patientid3 = Integer.parseInt(patientid);
      }
    
      String dname = request.getParameter("dname");
      String subjectroom = request.getParameter("subjectroom");
      String starttime = request.getParameter("starttime");
      String endtime = request.getParameter("endtime");
    
      // 页码
      int pageon = 1;
      String pageon1 = request.getParameter("pageon");
      if (pageon1 != null && !pageon1.equals("")) {
        pageon = Integer.parseInt(pageon1);
      }
      // 操作导出excel
      List<RegRum> selectlists = rs.querySelect2(patientid3, dname, subjectroom, starttime, endtime);
     //excel标题
      String title = "挂号信息表";
      //excel列头信息
      String[] rowsName = new String[] { "门诊编号", "主治医师", "挂号时间", "挂号科室", "状态" };
      List<Object[]> dataList = new ArrayList<Object[]>();
      Object[] objs = null;
      for (int i = 0; i < selectlists.size(); i++) {
        RegRum regRum = selectlists.get(i);
        objs = new Object[rowsName.length];
        objs[0] = regRum.getPatientid();
        objs[1] = regRum.getDoctor().getDname();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        objs[2] = regRum.getDate();
        objs[3] = regRum.getDoctor().getSubroomname();
        objs[4] = regRum.getStatus();
        dataList.add(objs);
    
      }
    

    8、下面这部分代码主要是把数据传给浏览器,前面部分告诉浏览器该数据流是什么类型的,本例传的是excel格式的,浏览器会自动判定为excel,提示是否保存。

    //给文件命名。随机命名
    String fileName = "Excel-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls";
         //告诉浏览器数据格式,将头和数据传到前台
          String headStr = "attachment; filename=\"" + fileName + "\"";
          response.setContentType("APPLICATION/OCTET-STREAM");
          response.setHeader("Content-Disposition", headStr);
          OutputStream out = response.getOutputStream();
    
    //调用poi的工具类
          ExportExcel ex = new ExportExcel(title, rowsName, dataList);
          try {
            ex.export(out);
          } catch (Exception e) {
            e.printStackTrace();
          }
          out.flush();
          out.close();
          return;
        }
    

    9、注意:如果从数据库查到的是数字,比如0代表男,1代表女,不加处理,会导出数字,处理方法如下:(主要代码),下面代码又没有的当前页的限制,根据条件查到多少打印多少。

    String patientid1 = request.getParameter("patientid");
          int patientid = 0;
          if (patientid1 != null && !patientid1.equals("")) {
            patientid = Integer.parseInt(patientid1);
          }
          String prescriptionid1 = request.getParameter("prescriptionid");
          int prescriptionid = 0;
          if (prescriptionid1 != null && !prescriptionid1.equals("")) {
            prescriptionid = Integer.parseInt(prescriptionid1);
          }
          String patientname = request.getParameter("patientname");
          String starttime = request.getParameter("starttime");
          String endtime = request.getParameter("endtime");
          List<Prescription> prescriptions = new ArrayList<Prescription>();
          prescriptions = sm.queryDao(prescriptionid, patientid, patientname, starttime, endtime);
          String title = "发药信息表";
          String[] rowsName = new String[] { "处方号", "病历号", "姓名", "日期", "状态" };
          List<Object[]> dataList = new ArrayList<Object[]>();
          //导出excel
          Object[] objs = null;
          for (int i = 0; i < prescriptions.size(); i++) {
            Prescription regRum = prescriptions.get(i);
            objs = new Object[rowsName.length];
            objs[0] = regRum.getPrescriptionid();
            objs[1] = regRum.getPatientid();
            objs[2] = regRum.getName();
            objs[3] = regRum.getPrescriptiondate();
            //对数字的操作
            if(regRum.getStatus().equals("1")) {
              objs[4] = "已结算";
            }
            else {
              objs[4]="已发药";
            }
            dataList.add(objs);
          }
          //下面代码主要跟上面一致
    

    10.数据库操作代码如下:(比较简单,只是把满足条件的list集合传到servlet,转变为数组,方便调用poi类)

    @Override
      public List<Prescription> query(int prescriptionid,int patientid, String patientname, String starttime, String endtime, int pageon) {
        Connection con = Jndi.getConnection();
        ResultSet rs = null;
        PreparedStatement ps = null;
        String sql = "select p.patientid,p.prescriptionid,r.patientname, p.diagnose ,p.prescriptiondate,sum(chargemoney*number),p.`pstatus` \r\n"
            + "from prescription p,regnum r,chargeitem c,prescriptioncharge pc  \r\n" + "\r\n"
            + " where  p.patientid=r.patientid and pc.prescriptionid=p.prescriptionid\r\n" + "\r\n" + "\r\n"
            + " and c.chargeid=pc.chargeid   ";
        if (patientid != 0) {
          sql = sql + " and p.patientid=" + patientid;
        }
        if (prescriptionid != 0) {
          sql = sql + " and p.prescriptionid=" + prescriptionid;
        }
        if (patientname != null && !patientname.equals("")) {
          sql = sql + " and r.patientname like '%" + patientname + "%'";
        }
        if (starttime != null && !starttime.equals("")) {
          sql = sql + " and p.prescriptiondate>'" + starttime + "'";
        }
        if (endtime != null && !endtime.equals("")) {
          sql = sql + " and p.prescriptiondate<'" + endtime + "'";
        }
        
    
    sql = sql + "  GROUP BY p.prescriptionid";
    if (pageon != 0) {
      sql = sql + " limit " + (pageon - 1) * 4 + ",4";
    }
    
    List<Prescription> listregs = new ArrayList<Prescription>();
    try {
      ps = con.prepareStatement(sql);
      rs = ps.executeQuery();
    
      while (rs.next()) {
        Prescription prescription = new Prescription();
        prescription.setPatientid(rs.getInt("patientid"));
        prescription.setPrescriptionid(rs.getInt("p.prescriptionid"));
        prescription.setDiagnose(rs.getString("diagnose"));
        prescription.setPrescriptiondate(rs.getString("prescriptiondate"));
        prescription.setStatus(rs.getString("pstatus"));
        prescription.setSummoney(rs.getDouble(6));
        prescription.setName(rs.getString(3));
        listregs.add(prescription);
      }
    
    } catch (SQLException e) {
      e.printStackTrace();
    } finally {
      Jndi.close(rs, ps, con);
    }
    return listregs;
    

    第一种比较复杂,如果想很快搞定,可以用纯js在前端导出table表格,需要导入四个js文件。引入进去。

    在这里插入图片描述
    二、纯js实现前台导出excel。
    1、导入js文件,可能也需要导入jquery文件,自行尝试。所需js文件地址。
    链接:https://pan.baidu.com/s/14-riXUTElxWaLHRHLe04SA
    提取码:fpnp

    <script type="text/javascript" src="<%=path %>/Js/jszip.min.js"></script>
    <script type="text/javascript" src="<%=path %>/Js/demo.page.js"></script>
    <script type="text/javascript" src="<%=path %>/Js/excel-gen.js"></script>
    <script type="text/javascript" src="<%=path %>/Js/FileSaver.js"></script>
    

    2、js代码如下

    <script type="text/javascript">
      $(document).ready(function(){
        alert()
        excel = new ExcelGen({
          "src_id":"test_table",//table的id
          "show_header":true
        });
        $("#generate-excel").click(function () {
          excel.generate();//执行导入包中的方法。
        })
      });
    </script>
    

    3、body中主要代码

    <table class="table table-bordered table-hover definewidth m10" id="test_table">
    //id在table中写
    //调用方法名在button写
    <button type="button" class="btn btn-success" id="generate-excel">导出Excel</button>
    

    注意:第二种方式,只能导出当前页的信息,它是根据table里面tr的数量导的,不会打印下一页。如果希望打印下一页的内容,提供一种思路,可以在按钮上添加跳转页面,跳到另一个页面,让另一个页面返回数据库全查需要的数据,写入新建页的table中,打印新table,有兴趣的可以尝试。 到这儿,可能读累了吧,听懂的给个赞,thanks.

    在这里插入图片描述

    展开全文
  • 用Qt开发已经九年了,期间用Qt做过不少的项目,在各种项目中有个功能很常用,尤其是涉及到数据记录存储的项目,那就是需要对查询的数据进行导出到Excel,或者导出到Pdf文件,或者直接打印查询的数据,其中导出数据到...

    一、前言

    用Qt开发已经九年了,期间用Qt做过不少的项目,在各种项目中有个功能很常用,尤其是涉及到数据记录存储的项目,那就是需要对查询的数据进行导出到Excel,或者导出到Pdf文件,或者直接打印查询的数据,其中导出数据到Excel最常见,基本上有三种方法。
    方法一使用QAxObject,小数据量还可以,数据量一大直接懵逼,性能指数级下降,而且不支持跨平台,只能在WIN上玩一玩,对于大量的linux开发者来说,直接废了。
    方法二使用第三方开源的QtXlsx,这个做的还是可以,使用人群也比较多,据说不依赖office组件跨平台的,缺点就是不支持xls格式,只支持高版本的xlsx,使用稍微比较繁琐,用户更多的需要的是直接一个函数传入对应的数据即可,越简单越好。
    方法三使用csv格式作为导出数据,纯文本的数据存储格式,默认逗号作为分隔符,也可以指定其他符号作为分隔符,csv格式也是各种表格软件都支持的格式,相当轻便,作为各大系统或者平台和编程语言之间交互数据还是非常方便的,很多工业控制领域的软件都会采用这种格式,缺点就是太简单了,不能分组或者指定过滤条件特殊颜色显示等。
    在对比了三种方式以后,决定自己造个轮子,主要是为了自身项目的需要写的,后面慢慢的客户需求多了,增加了通用常用场景的数据导出需求,目标要求至少包含三点:速度够快、使用够简洁、不依赖任何组件。
    Demo示例地址:https://pan.baidu.com/s/1uQsDQO5E5crUBN2J-nPeLQ 提取码:1jkp 名称:bin_dataout.zip

    二、功能特点

    1. 原创导出数据机制,不依赖任何office组件或者操作系统等第三方库,尤其是支持嵌入式linux。
    2. 10万行数据9个字段只需要2秒钟完成。
    3. 只需要四个步骤即可开始急速导出大量数据到Excel。
    4. 同时提供直接写入数据接口和多线程写入数据接口,不卡主界面。
    5. 可设置标题、副标题、表名。
    6. 可设置字段名称、列宽度。
    7. 可设置是否启用校验过滤数据、校验的列、校验规则、校验值,符合规则的特殊颜色显示。
    8. 可设置随机背景颜色及需要随机背景色的列集合。
    9. 支持分组输出数据,比如按照设备分组输出数据,方便查看。
    10. 可自定义行内容分隔符。
    11. 可追加数据形式写入数据,建议每次追加的数据小于10000条。
    12. 灵活性超高,可自由更改源码设置对齐方式、文字颜色、背景颜色等。
    13. 支持任意excel表格软件,包括但不限于excel2003/2007/2010/2013/2017/wps/openoffice等。
    14. 除了提供导出到Excel类以外,还提供导出到Pdf文件以及打印数据的类。
    15. 注释完善,详细完整的使用demo,支持QTableWidget、QTableView、数据库三种数据源。
    16. 纯Qt编写,支持任意Qt版本+任意编译器+任意系统。

    三、效果图

    在这里插入图片描述

    四、使用方法

    //第一步:设置文件路径,标题等信息;
    QList<QString> columnNames;
    QList<int> columnWidths;
    columnNames << "防区号" << "防区名称" << "告警类型" << "告警内容" << "告警时间";
    columnWidths << 65 << 100 << 120 << 150 << 180;
    
    QString file = qApp->applicationDirPath() + "/1.xls";
    ExcelThread::Instance()->init();
    ExcelThread::Instance()->setFileName(file);
    ExcelThread::Instance()->setSheetName("告警信息");
    ExcelThread::Instance()->setTitle("所有告警信息");
    ExcelThread::Instance()->setSubTitle(QString("%1 导出告警信息").arg(DATETIME));
    ExcelThread::Instance()->setColumnNames(columnNames);
    ExcelThread::Instance()->setColumnWidths(columnWidths);
    
    //第二步:打开文件,启动线程;
    ExcelThread::Instance()->open();
    ExcelThread::Instance()->start();
    
    //第三步:逐行输入数据;
    QStringList list;
    list << "防区上线" << "防区离线" << "防区旁路" << "防区报警" << "防区故障";
    for (int i = 0; i < logCount; i++) {
        int index = qrand() % 4;
        QStringList temp;
        temp.append(QString::number(i + 1));
        temp.append("防区" + QString::number(i + 1));
        temp.append("主机上报");
        temp.append(list.at(index));
        temp.append(DATETIME);
        ExcelThread::Instance()->appendContent(temp.join(";"));
    }
    
    //第四步:关闭文件,关闭线程;
    ExcelThread::Instance()->close();
    ExcelThread::Instance()->stop();
    
    展开全文
  • poi导入、导出,支持百万级数据模板导出、合并excel。项目为spring-boot-2上开发。resource里面有模板,在junit测试类中修改为本地存在路径即可导出文件,在junit测试类中修改for循环的i可以模拟百万级数据导出。注意...
  • 前端实现导出及下载文件

    千次阅读 2020-04-02 14:34:35
    前端实现导出及下载文件 首先解释下,单靠前端是无法实现,下载功能的,前端只能实现触发下载,下面是2种实现方式 下面用vue的代码示例 一、 利用window.open()和iframe //html <template> <div> <...

    前端实现导出及下载文件

    首先解释下,单靠前端是无法实现,下载功能的,前端只能实现触发下载,
    后端实现下载

    下面是2种实现方式

    下面用vue的代码示例

    一、 利用window.open()和iframe

    //html
    <template>
    <div>
    <button  @click="toDownload"> 导出   </button>
       <!-- 用于打开下载窗口 -->
        <iframe name="downloadIframe" style="display:none" />
    <div>
    </template>
    <script>
        export default {
            methods:{
                toDownload(){
                    //第一个参数为下载的地址,如果要携带参数,后面拼接,
                    //第二参数,为窗口如何打开
                  window.open('http://localhost:8080/user/downLoad/name.jpg', 'downloadIframe')  
                } 
            }
        }
      </script>
        
    

    二、form表单下载

    form 表单提交 是formdata数据

    会以表单中input的name值为可以值,input框中输入的值为value组成一个对象

    如果没有name值是不会上传的

    <template>
    <div>
        
        <form id="downForm" action="http://localhost:8080/user/downLoad"  method="POST" target="downloadIframe" enctype="multipart/form-data" >
            <input name="userName" v-model="userName" />
            <!-- 模拟不是input的渲染组件-->
            <input v-model="tel"/>
              <!--有些时候,需要传递的数据,并不是input框,这个时候可以定义一个隐藏的input用于接收 -->
             <input type="hidden"   name="tel" />
            <
        </form>
    <button  @click="toDownload"> 导出   </button>
       <!-- 用于打开下载窗口 -->
        <iframe name="downloadIframe" style="display:none" />
    <div>
    </template>
    <script>
        export default {
            data(){
                return{
                    userName:'',
                    tel:''
                }
    		},
            methods:{
                toDownload(){
                    //这样就可以手动修改form表单的值
                  document.getElementById("downForm").tel.value = this.tel
                   document.getElementById("downForm").submit();
                } 
            }
        }
    

    在这里插入图片描述

    展开全文
  • MySQL——表的导出和导入

    万次阅读 2018-06-07 14:51:10
    有时会需要将MySQL数据4中的数据导出到外部存储文件中,... 用 SELECT…INTO OUTFILE 导出文本文件 在 MySQL 数据库中导出数据时,允许使用包含导出定义的 SELECT 语句进行数据的导出操作。该文件在服务器...
  • 导出https网站证书

    万次阅读 2018-05-20 19:09:48
    谷歌浏览器打开https网站后,点击url地址栏前面的安全,点击证书,显示证书对话框,点击上面标签页,详细信息,下面的复制到文件,打开导出证书对话框,选择... 保存的证书文件,可以双击安装,或者开发时研究...
  • Android导出已安装应用程序apk文件的两种方案 如果已经在Android手机上安装了App应用程序,那么Android系统会保留应用程序的apk安装副本。如果要导出这些apk文件,有以下两种方案:第一种方案:命令行模式。 先...
  • 1.export与export default均可用于导出常量、函数、文件、模块等 2.在一个文件或模块中,export、import可以有多个,export default仅有一个 3.通过export方式导出,在导入时要加{ },export default则不需要 4. (1)...
  • Java 导出Excel利用模版导出

    万次阅读 2018-07-31 15:11:16
    Java导出Excel和word的方式大体相同 1、Excel模版导出到页面下载 首先,导入依赖在pom.xml中我选择的事1.03的版本  第二、在项目或是自己需要的地方建立个文件夹放导出文件的模版,并且配好模版    第三...
  • 订单导出(淘宝天猫)

    万次阅读 热门讨论 2020-06-02 18:23:33
    最新版: ... 在多语言Windows XP/Vista/7/8/10上测试通过,中英日韩 ...淘宝天猫买家卖家订单导出,可视化方案直观呈现所有订单的数据 注意:只能导出自己已登录账号下的订单数据,而不是采集任意其他用...
  • Java导出数据到Excel

    万次阅读 多人点赞 2017-07-18 17:58:24
    Java操作Excel数据表,导出工具类,让导出更便捷!
  • Java 导入导出功能总结

    万次阅读 多人点赞 2019-03-23 12:12:40
    项目中经常需要使用导入导出功能来加快数据的操作,尤其是一些项目的后台管理系统,特此奉上我们项目中使用到导入导出代码,均可以实际使用。准备工作:pom中加入以下依赖: <dependency> <groupId>...
  • Git 历史提交日志导出到文件中

    万次阅读 2019-03-20 16:48:18
    git 的历史提交记录导出 如何把 git 的历史提交记录导出来,下面的这个命令就可以做到。 在项目根目录下执行命令,导出 git 提交记录到桌面 git log –pretty=format:”%ai , %an: %s” –since=”100 day ...
  • oracle11g数据库导入导出方法教程

    万次阅读 多人点赞 2020-06-23 08:25:10
    oracle11g数据库导入导出: ①:传统方式——exp(导出)和(imp)导入: ②:数据泵方式——expdp导出和(impdp)导入; ③:第三方工具——PL/sql Develpoer;一、什么是数据库导入导出? oracle11g数据库的导入/导出,...
  • Oracle导入导出表结构和表数据

    万次阅读 2018-08-15 16:53:40
    测试使用PL/SQL导出表结构和表数据: 1、选择导出的表结构和表数据 点击工具-&gt;导出表菜单,选择导出表所在的用户和导出数据使用的程序,以及导出数据的输出文件。 其中导出程序一般是Oracle安装目录下的...
  • js 实现纯前端将数据导出excel两种方式,亲测有效

    万次阅读 多人点赞 2019-03-15 08:38:22
    由于项目需要,需要在不调用后台接口的情况下,将json数据导出到excel表格,参考了好多资料以及很多大佬写的博客终于实现,兼容chrome没问题,其他还没有测试过,这边介绍两种实现方式,并附上代码和gif动图,博主...
  • Hive总结(八)Hive数据导出三种方式

    万次阅读 2019-09-12 20:32:13
    今天我们再谈谈Hive中的三种不同的数据导出方式。根据导出的地方不一样,将这些方式分为三种:(1)导出到本地文件系统;(2)导出到HDFS中;(3)导出到Hive的另一个表中。为了避免单纯的文字,我将一步一步地用...
  • 【开源】博客导出工具

    万次阅读 多人点赞 2018-03-06 16:49:32
    本人就这些需求,特开发了C#版【博客导出工具】。该工具现支持的网站包括:CSDN、ITEYE、博客园、新浪、搜狐、和讯、ChinaUnix、网易、51CTO、开源中国、百度空间、QQ空间(如有遗漏请留言补充)。支持3种导出方式:...
  • 博客导出工具

    万次阅读 多人点赞 2015-08-17 14:18:41
    本人就这些需求,特开发了C#版【博客导出工具】。 该工具现支持的网站包括: CSDN、ITEYE、博客园、新浪、搜狐、和讯、ChinaUnix、网易、51CTO、开源中国、百度空间、QQ空间(如有遗漏请留言补充)。 支持3种导出...
1 2 3 4 5 ... 20
收藏数 800,386
精华内容 320,154
关键字:

导出