ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

poi导出图片

2021-04-01 14:32:40  阅读:169  来源: 互联网

标签:poi 导出 vo org apache import usermodel 图片


poi导出图片如图:
在这里插入图片描述
主要代码:
在这里插入图片描述
在这里插入图片描述

注:此为SSH项目 条件导出
配置依赖

    <dependency>
		  <groupId>org.apache.poi</groupId>
		  <artifactId>poi</artifactId>
		  <version>3.17</version>
		</dependency>
		<dependency>
		  <groupId>org.apache.poi</groupId>
		  <artifactId>poi-ooxml</artifactId>
		  <version>3.17</version>
	</dependency>

在前端写两个按钮

 <button type="button" onclick="exportExcel2()" class="btn btn-info">
	<span class="glyphicon glyphicon-circle-arrow-down"></span>导出Excel
</button>
<button type="button" onclick="importExcel()" class="btn btn-warning">
	<span class="glyphicon glyphicon-circle-arrow-up"></span>导入Excel
</button>

在这里插入图片描述

定义方法 在条件查询表单中加个id,查询字段都加个name值以便传到后台进行查询

<script type="text/javascript">
	// 页面加载函数
	$(function(){
		//初始化
		importExcelHTML = $("#importExcelDiv").html();
	})
	// 导出Excel
	function exportExcel2(){
		// 获取条件查询的form表单
		var searchForm = document.getElementById("searchForm");
		// 给form表单设置提交路径
		searchForm.action = "<%=request.getContextPath()%>/excelController/exportExcel2.do";
		// 提交form表单
		searchForm.submit();
	}
	// 导入Excel
	function importExcel(){
		$("#importExcelDiv").html(importExcelHTML);
		
		initImportInput();
		
		importDialog = bootbox.dialog({
			title:"<h3>导入Excel</h3>",
			message:$("#importExcelDiv form")
		})
	}
</script>

导入时的弹框

<!-- 导入页面内容 -->
	<div id="importExcelDiv" style="display:none;">
		<form id="importExcelForm" class="form-horizontal">
			<div class="form-group">
				<label for="firstname" class="col-sm-2 control-label">选择文件</label>
				<div class="col-sm-8">
					<input type="file" class="form-control" name="uploadExcel" id="excel"/>
				</div>
			</div>
		</form>
	</div>

后台Controller接值

package com.ff.controller;

import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.ff.model.Drug;
import com.ff.model.DrugArea;
import com.ff.model.Drugbrand;
import com.ff.service.DrugService;
import com.ff.util.ExcelUtil;
import com.ff.vo.DrugVo;
@Controller
@RequestMapping("excelController")
public class ExcelController {

	@Autowired
	private DrugService drugService;

	//下载xlsx//导出
	@RequestMapping("exportExcel2")
	@ResponseBody
	public void exportExcel(DrugVo vo, HttpServletRequest request, HttpServletResponse response) {
		// 查询要到导出的数据
		List<Drug> list = drugService.exportExcel(vo);
		ExcelUtil.exportExcel(vo, request, response, list);
		
	}
	
     	// 导入Excel
		@RequestMapping("importExcel")
		@ResponseBody
		public Map<String, Object> importExcel(MultipartFile uploadExcel){
			Map<String, Object> map = new HashMap<>();
			try {
              //1.将文件封装成工作薄
				XSSFWorkbook workbook = new XSSFWorkbook(uploadExcel.getInputStream());
          //2.获取工作表的数量
				int numberOfSheets = workbook.getNumberOfSheets();
          //3.循环所有的工作表,根据工作表下标获取对应的sheet
				for (int i = 0; i < numberOfSheets; i++) {
					XSSFSheet sheet = workbook.getSheetAt(i);
          // 4.获取当前工作表中数据的开始位置
					int firstRowNum = sheet.getFirstRowNum();
          // 5.获取当前工作表中数据的结束位置
					int lastRowNum = sheet.getLastRowNum();
          // 6.将文件中的数据封装为一个list保存到数据库中
					List<drug> list = new ArrayList<drug>();
					for (int j = firstRowNum+1; j <= lastRowNum; j++) {
						// 获取sheet中的每一行
						XSSFRow row = sheet.getRow(j);
						// 获取行中单元格的值
						Drug drug = getExcelDate(row);
						drugService.addDrug(drug);
					}
				}
				map.put("state", true);
			} catch (IOException e) {
				e.printStackTrace();
				map.put("state", false);
			}

			return map;
		}

		private Drug getExcelDate(XSSFRow row) {
			String name = row.getCell(1).getStringCellValue();
			double price = row.getCell(2).getNumericCellValue();
			double drugSales = row.getCell(3).getNumericCellValue();
			double drugStock = row.getCell(4).getNumericCellValue();
			//地区
			String area = row.getCell(5).getStringCellValue();
			String brand = row.getCell(6).getStringCellValue();
			String isOtc = row.getCell(7).getStringCellValue();
			String person = row.getCell(8).getStringCellValue();
			Date date = row.getCell(9).getDateCellValue();
			//图片
			String img = row.getCell(10).getStringCellValue();
			
			
			DrugArea area2 = new DrugArea();
			area2.setDrugAreaId(area.equals("山东")?1:area.equals("河南")?2:area.equals("北京")?3:null);
			
			Drugbrand brand2=new Drugbrand();
			brand2.setDrugBrandId(brand.equals("中华西药")?1:brand.equals("河南中药")?2:brand.equals("草药")?3:null);
			
			Drug drug=new Drug(
					name,
					(int)price, 
					(int)drugSales,
					(int)drugStock, 
					isOtc.equals("非处方药")?1:isOtc.equals("处方药")?2:null, 
					person.replace("幼年", "1").replace("少年", "2").replace("青年", "3").replace("中年", "4").replace("老年", "5").replace("孕妇", "6"),
					date,
					img, 
					area2, 
					brand2);
				return drug;
		}
}

ExcelUtil工具类

package com.ff.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Picture;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.ff.model.Drug;
import com.ff.vo.DrugVo;

public class ExcelUtil {

	// 下载路径
	public static void excelDownload(XSSFWorkbook wirthExcelWB, HttpServletRequest request,
			HttpServletResponse response, String fileName) {
		OutputStream out = null;
		try {

			// 解决下载文件名中文乱码问题
			if (request.getHeader("User-agent").toLowerCase().indexOf("firefox") != -1) {
				fileName = new String(fileName.getBytes("utf-8"), "iso-8859-1");
			} else {
				fileName = URLEncoder.encode(fileName, "utf-8");
			}

			out = response.getOutputStream();
			// 让浏览器识别是什么类型的文件
			response.reset(); // 重点突出
			response.setCharacterEncoding("UTF-8"); // 重点突出
			response.setContentType("application/x-msdownload");// 不同类型的文件对应不同的MIME类型
																// // 重点突出
			// inline在浏览器中直接显示,不提示用户下载
			// attachment弹出对话框,提示用户进行下载保存本地
			// 默认为inline方式
			response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
			wirthExcelWB.write(out);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (null != out) {
				try {
					out.close();
					out = null;
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	   //下载xlsx 
		public static void exportExcel(DrugVo vo, HttpServletRequest request, HttpServletResponse response,
			
				//List<drug> list  ============================================需要改
				List<Drug> list) {
			// 创建一个excel表格
			XSSFWorkbook workbook = new XSSFWorkbook();
			// 创建sheet页
			XSSFSheet sheet = workbook.createSheet();
			// 创建表头行
			XSSFRow headerRow = sheet.createRow(0);
			// 创建一个内容剧中的的单元格样式
			XSSFCellStyle cellStyle = workbook.createCellStyle();
			cellStyle.setAlignment(HorizontalAlignment.CENTER);
			// 设置背景颜色
			cellStyle.setFillForegroundColor(HSSFColor.LIGHT_GREEN.index);
			cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

			// 字体加粗
			XSSFFont font = workbook.createFont();
			font.setBold(true);
			cellStyle.setFont(font);
			


			// 表头
			//"序号", "电影名称", "电影价格", "电影评分", "上映地区", "上映时间", "适合人群", "是否上映", "余票数量"   ============================================需要改
			String[] headerNameArr = { "序号","药品名称","价格","销量","库存","产地","品牌","是否处方药","适合人群","生产日期","药品照片"};
			Integer[] headerWidthArr = { 12 * 256, 20 * 256, 12 * 256, 12 * 256, 20 * 256, 20 * 256, 20 * 256, 20 * 256,12 * 256,12 * 256, 20 * 256 };
			for (int i = 0; i < headerWidthArr.length; i++) {
				XSSFCell cell = headerRow.createCell(i);
				cell.setCellValue(headerNameArr[i]);
				cell.setCellStyle(cellStyle);
				// 给单元格设置宽度
				sheet.setColumnWidth(i, headerWidthArr[i]);
				sheet.setDefaultRowHeightInPoints(2000*2000);
			}

			// 设置日期类型的表格
			XSSFCellStyle cellStyle2 = workbook.createCellStyle();
			XSSFDataFormat format = workbook.createDataFormat();
			cellStyle2.setDataFormat(format.getFormat("yyyy-MM-dd HH:mm:ss"));
			cellStyle2.setAlignment(HorizontalAlignment.CENTER);
			setCellWidth(cellStyle2);

			// 设置字体居中
			XSSFCellStyle cellStyle3 = workbook.createCellStyle();
			cellStyle3.setAlignment(HorizontalAlignment.CENTER);
			setCellWidth(cellStyle3);
			
			
			// 往excel中放值
			//drug drug = list.get(i);值  ============================================需要改
			try {
				
				// 往excel中放值
				for (int i = 0; i < list.size(); i++) {
					Drug drug = list.get(i);
					XSSFRow row = sheet.createRow(i+1);
					// 创建单元格并且给单元格赋值
					XSSFCell cell = row.createCell(0);
					cell.setCellValue(i+1);
					cell.setCellStyle(cellStyle3);
					//设置高度
					row.setHeightInPoints(50);
					
					
					// 插入 图片至 Excel  
					String path = request.getServletContext().getRealPath("");
					String posterPath = drug.getFileName();
					File file=new File(path+posterPath);
					if(file.exists()) {
						InputStream is = new FileInputStream(path+posterPath); 
						byte[] bytes = IOUtils.toByteArray(is); 
						int pictureIdx = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG); 
						CreationHelper helper = workbook.getCreationHelper(); 
						Drawing drawing = sheet.createDrawingPatriarch(); 
						// anchor主要用于设置图片的属性
						ClientAnchor anchor = helper.createClientAnchor(); 
						// 图片插入坐标 
						anchor.setCol1(10); //列
						anchor.setRow1(i+1); //行
						// 使用固定的长宽比例系数
						double a = 1;
						double b = 1;
						// 插入图片 
						Picture pict = drawing.createPicture(anchor, pictureIdx); 
						pict.resize(a,b); 
					}
				
					
					
					XSSFCell cell1 = row.createCell(1);
					cell1.setCellValue(drug.getDrugName());
					cell1.setCellStyle(cellStyle3);
					
					XSSFCell cell2 = row.createCell(2);
					cell2.setCellValue(drug.getDrugPrice());
					cell2.setCellStyle(cellStyle3);
					
					XSSFCell cell3 = row.createCell(3);
					cell3.setCellValue(drug.getDrugSales());
					cell3.setCellStyle(cellStyle3);
					
					XSSFCell cell4 = row.createCell(4);
					cell4.setCellValue(drug.getDrugStock());
					cell4.setCellStyle(cellStyle3);
					
					XSSFCell cell5 = row.createCell(5);
					cell5.setCellValue(drug.getDrugArea()==null?null:drug.getDrugArea().getDrugAreaName());
					cell5.setCellStyle(cellStyle3);
					
					XSSFCell cell6 = row.createCell(6);
					cell6.setCellValue(drug.getDrugBrand()==null?null:drug.getDrugBrand().getDrugBrandName());
					cell6.setCellStyle(cellStyle3);
					
					XSSFCell cell7 = row.createCell(7);
					cell7.setCellValue(drug.getIsOtc()==1?"非处方药":"处方药");
					cell7.setCellStyle(cellStyle3);
					
					XSSFCell cell8 = row.createCell(8);
					cell8.setCellValue(drug.getPerson()==null?null:drug.getPerson().replace("1", "幼儿").replace("2", "少年").replace("3", "青年").replace("4", "中年").replace("5", "老年").replace("6", "孕妇"));
					cell8.setCellStyle(cellStyle3);
					
					
					XSSFCell cell9 = row.createCell(9);
					cell9.setCellValue(drug.getProducedDate());
					cell9.setCellStyle(cellStyle2);
					
		
					XSSFCell cell0 = row.createCell(10);
					cell0.setCellValue(drug.getFileName());
				
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			ExcelUtil.excelDownload(workbook, request, response, "电影列表.xlsx");
		}
		

	private static void setCellWidth(XSSFCellStyle cellStyle) {
		// 给单元格加边框
		cellStyle.setBorderRight(BorderStyle.THIN);
		cellStyle.setRightBorderColor(HSSFColor.BLACK.index);

		cellStyle.setBorderLeft(BorderStyle.THIN);
		cellStyle.setLeftBorderColor(HSSFColor.BLACK.index);

		cellStyle.setBorderTop(BorderStyle.THIN);
		cellStyle.setTopBorderColor(HSSFColor.BLACK.index);

		cellStyle.setBorderBottom(BorderStyle.THIN);
		cellStyle.setBottomBorderColor(HSSFColor.BLACK.index);
	}

	/**
	 * 文件下载
	 * 
	 * @param file
	 * @param fileName
	 * @param response
	 */
	public static void downloadFile(File file, String fileName, HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		OutputStream os = response.getOutputStream();
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
		BufferedOutputStream bos = new BufferedOutputStream(os);
		// 解决下载文件名中文乱码问题
		if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") != -1) {
			fileName = new String(fileName.getBytes("utf-8"), "iso-8859-1");
		} else {
			fileName = URLEncoder.encode(fileName, "utf-8");
		}
		response.reset(); // 重点突出
		response.setCharacterEncoding("UTF-8"); // 重点突出
		response.setContentType("application/x-msdownload");// 不同类型的文件对应不同的MIME类型
		response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
		// 定义一个长度为4096的字节数组
		byte[] bytes = new byte[4096];
		// 先读他个4096字节
		int read = bis.read(bytes);
		while (read > 0) {
			bos.write(bytes, 0, read);
			read = bis.read(bytes);
		}
		bos.close();
		bis.close();
	}
	
}

dao层执行

package com.ff.dao.impl;

import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Conjunction;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;

import com.ff.dao.MovieDao;
import com.ff.model.movie.Movie;
import com.ff.model.movie.MovieVO;
import com.ff.util.DataTableUtil;

@Repository
public class MovieDaoImpl implements MovieDao {
	
	@Autowired
	private HibernateTemplate hibernateTemplate;
	//查询数据
	@Override
	public void queryMovieList(DataTableUtil<Movie> page, MovieVO vo) {
		Criteria criteria = hibernateTemplate.getSessionFactory().getCurrentSession().createCriteria(Movie.class);
		whereSearch(vo, criteria);
		page.setRecordsTotal(criteria.list().size());
		criteria.setFirstResult(page.getStart());
		criteria.setMaxResults(page.getLength());
		page.setData(criteria.list());
	}
	//条件导出
	@Override
	public List<Movie> queryMovieList(MovieVO vo) {
		Criteria criteria = hibernateTemplate.getSessionFactory().getCurrentSession().createCriteria(Movie.class);
		whereSearch(vo, criteria);
		return criteria.list();
	}
	//提取封装
	private void whereSearch(MovieVO vo, Criteria criteria) {
		if (vo != null) {
			if (StringUtils.isNotBlank(vo.getMovieName())) {
				criteria.add(Restrictions.like("movieName", "%"+vo.getMovieName()+"%"));
			}
			if (vo.getMinPrice() != null) {
				criteria.add(Restrictions.gt("moviePrice", vo.getMinPrice()));
			}
			if (vo.getMaxPrice() != null) {
				criteria.add(Restrictions.lt("moviePrice", vo.getMaxPrice()));
			}
			if (vo.getMinDate() != null) {
				criteria.add(Restrictions.gt("pubDate", vo.getMinDate()));
			}
			if (vo.getMaxDate() != null) {
				criteria.add(Restrictions.lt("pubDate", vo.getMaxDate()));
			}
			if (vo.getIsup() != null) {
				criteria.add(Restrictions.eq("isup", vo.getIsup()));
			}
			if (StringUtils.isNotBlank(vo.getPerson())) {
				String[] arr = vo.getPerson().split(",");
				//	Disjunction(抵死军可申)添加的是逻辑或(OR)的关系,另外还有个Conjunction,添加的是逻辑与(AND)的关系
				//  Restrictions.disjunction() 逻辑或
				Disjunction disjunction = Restrictions.disjunction();
				for (int i = 0; i < arr.length; i++) {
					// MatchMode.ANYWHERE --> 字符串在中间匹配.相当于"like '%value%'"
					disjunction.add(Restrictions.like("person", "%"+arr[i]+"%", MatchMode.ANYWHERE));
				}
				criteria.add(disjunction);
			}
			if(vo.getAreaId() != -1 && vo.getAreaId() != null){
				criteria.add(Restrictions.eq("area.areaId", vo.getAreaId()));
			}
		}
	}
}

标签:poi,导出,vo,org,apache,import,usermodel,图片
来源: https://blog.csdn.net/jq1223/article/details/115372748

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有