java实现excel导入导出以及解决方案

因为公司业务需求,要完成针对表格的导入导出,excel这里使用MultipartFile类接收
,下面是部分关键代码,希望有所帮助

             //获取excel文件的输入流,必须是.xlsx后缀,如果是xlsx后缀,要用HSSFWorkBookXSSFWorkbook xssfWorkbook = new XSSFWorkbook(multipartFile.getInputStream());//获取表格XSSFSheet sheetAt = xssfWorkbook.getSheetAt(0);// 创建sheetSheet sheet = null;//获取excel sheet总数
//            int sheetNumbers = xssfWorkbook.getNumberOfSheets();
//            // sheet list
//            List<Map<String, PictureData>> sheetList = new ArrayList<Map<String, PictureData>>();sheet = xssfWorkbook.getSheetAt(0);// map等待存储excel图片Map<String, PictureData> sheetIndexPicMap;// 判断获取图片和对象XSSFWorkbook sheetPictrues07 = getSheetPictrues07(0, (XSSFSheet) sheet, xssfWorkbook);XSSFSheet sheetAt2 = sheetPictrues07.getSheetAt(0);sheet.shiftRows(1, 1, -1);

下面的代码是只获取图片的处理

    /*** 获取Excel2007图片 \ word \execl \PowerPoint** @param sheetNum 当前sheet编号* @param sheet    当前sheet对象* @param workbook 工作簿对象* @return Map key:图片单元格索引(0_1_1)String,value:图片流PictureData*/public XSSFWorkbook getSheetPictrues07(int sheetNum, XSSFSheet sheet, XSSFWorkbook workbook) throws IOException, OpenXML4JException, XmlException {for (POIXMLDocumentPart dr : sheet.getRelations()) {if (dr instanceof XSSFDrawing) {XSSFDrawing drawing = (XSSFDrawing) dr;List<XSSFShape> shapes = drawing.getShapes();for (XSSFShape shape : shapes) {XSSFPicture pic = (XSSFPicture) shape;XSSFClientAnchor anchor = pic.getPreferredSize();//所在偏移量对象CTMarker ctMarker = anchor.getFrom();//获取表格簿XSSFSheet sheetAt = workbook.getSheetAt(0);//获取行XSSFRow row = sheetAt.getRow(ctMarker.getRow());//创建列XSSFCell cell = row.createCell(ctMarker.getCol());//填入其对应上传七牛云的图片编号cell.setCellValue(printsImg(pic.getPictureData()));}}

如果你还要获取嵌入对象的话,需要判断其对象文件的隐性xml格式类型

  /*** 获取Excel2007图片 \ word \execl \PowerPoint** @param sheetNum 当前sheet编号* @param sheet    当前sheet对象* @param workbook 工作簿对象* @return Map key:图片单元格索引(0_1_1)String,value:图片流PictureData*/public XSSFWorkbook getSheetPictrues07(int sheetNum, XSSFSheet sheet, XSSFWorkbook workbook) throws IOException, OpenXML4JException, XmlException {for (POIXMLDocumentPart dr : sheet.getRelations()) {PackagePart packagePart = dr.getPackagePart();String contentType = packagePart.getContentType();//获取表格簿XSSFSheet sheetAt = workbook.getSheetAt(0);switch (contentType) {case "application/vnd.ms-excel": {//offic 2003 excelHSSFWorkbook embeddedWorkbook = new HSSFWorkbook(packagePart.getInputStream());printsImg(packagePart.getInputStream(),"xlx");break;}// Excel Workbook - OpenXML file format offic 2007 excelcase "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {XSSFWorkbook embeddedWorkbook = new XSSFWorkbook(packagePart.getInputStream());printsImg(packagePart.getInputStream(),"xlsx");break;}// Word Document - binary (OLE2CDF) file format offic 2003 wordcase "application/msword": {HWPFDocument document = new HWPFDocument(packagePart.getInputStream());printsImg(packagePart.getInputStream(),"doc");break;}// Word Document - OpenXML file format 2007case "application/vnd.openxmlformats-officedocument.wordprocessingml.document": {XWPFDocument document = new XWPFDocument(packagePart.getInputStream());printsImg(packagePart.getInputStream(),"docx");break;}// PowerPoint Document - binary file format 2003 pptcase "application/vnd.ms-powerpoint": {HSLFSlideShow slideShow = new HSLFSlideShow(packagePart.getInputStream());printsImg(packagePart.getInputStream(),"ppt");break;}// PowerPoint Document - OpenXML file formatcase "application/vnd.openxmlformats-officedocument.presentationml.presentation": {OPCPackage docPackage = OPCPackage.open(packagePart.getInputStream());XSLFSlideShow slideShow = new XSLFSlideShow(docPackage);printsImg(packagePart.getInputStream(),"pptx");break;}//PowerPoint Document - OpenXML file format  照片case "application/vnd.openxmlformats-officedocument.drawing+xml": {if (dr instanceof XSSFDrawing) {XSSFDrawing drawing = (XSSFDrawing) dr;List<XSSFShape> shapes = drawing.getShapes();for (XSSFShape shape : shapes) {XSSFPicture pic = (XSSFPicture) shape;XSSFClientAnchor anchor = pic.getPreferredSize();//所在偏移量对象CTMarker ctMarker = anchor.getFrom();//获取行XSSFRow row = sheetAt.getRow(ctMarker.getRow());//创建列XSSFCell cell = row.createCell(ctMarker.getCol());//填入其对应上传七牛云的图片编号cell.setCellValue(printsImg(pic.getPictureData()));}}break;}
//                 Any other type of embedded object.default:System.out.println("Unknown Embedded Document: " + contentType);
//                    InputStream inputStream = packagePart.getInputStream();
//                    (Worksheet)sheet;OPCPackage aPackage = packagePart.getPackage();workbook.getSheetIndex(packagePart.getPartName().getName());break;}

接下来是导出,但接下来说明一下,两个难点(个人认为)

  • 导入时

在表格里面的图片,我可以获取到他的所处位置,然后上传至七牛云,然后将其图片地址插入对应位置的单元格中,是可以的。
但是如果,你的是文件的话,判断文件类型之后,我只能通过packagePart.getInputStream()去获取文件的流,读取到文件,可是我无法获取到文件的位置(所处单元格位置),就没办法和该行的数据对应,我就不能知道他是哪一行数据的携带附件

  • 导出时

如果是将文件插入对应的单元格,如果是图片的话,是可以的
在java插入excel是有盲区的,poi反正我尝试了很久,往对应的单元格当中插入对象文件,还是不行,
我无法通过XSSFSheet对象 或者XSSword对象去插入它,图片的到是有一个如下图

             ByteArrayOutputStream byteArrayOut = excelData(list.get(i).getPhoto());//图片格式距离单元格left,top,right,bottom的像素距离XSSFClientAnchor anchor1 = new XSSFClientAnchor(0, 0, 0, 0, 7,i +1, 8, index);drawingPatriarch.createPicture(anchor1, wb.addPicture(byteArrayOut.toByteArray(), XSSFWorkbook.PICTURE_TYPE_JPEG));

所以最后决定换成插入的附件文件采用超链接的方式,代码如下

 //文件生成超链接方式XSSFCreationHelper creationHelper = wb.getCreationHelper();XSSFHyperlink hyperlink = (XSSFHyperlink) creationHelper.createHyperlink(HyperlinkType.URL);hyperlink.setAddress("域名"+list.get(i).getSurveyManual());row.createCell(2).setHyperlink(hyperlink);row.createCell(2).setCellValue("点击下载附件");

最后在附上七牛云工具类

@Slf4j
public class QiniuCloudUtil {/*** 设置需要操作的账号的AK和SK*/private static final String ACCESS_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxx";private static final String SECRET_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxx";// 要上传的空间名private static final String BUCKETNAME = "xxxxxxxxxx";/*** 外链域名 读取时使用*/private static final String DOMAIN = "xxxxxxxxxxxxxxxxxxx";/*** 密钥*/private static final Auth AUTH = Auth.create(ACCESS_KEY, SECRET_KEY);/*** 文件允许的后缀扩展名*/public static String[] IMAGE_FILE_ETD = new String[] { "png", "bmp", "jpg", "jpeg","pdf" };@Resourceprivate RestTemplate restTemplate;/*** 上传** @param file* @return* @throws IOException*/public static String upload(InputStream file, String ext) throws IOException {// 创建上传对象,Zone*代表地区Region region = Region.region2();Configuration configuration = new Configuration(region);UploadManager uploadManager = new UploadManager(configuration);try {// 调用put方法上传String token = AUTH.uploadToken(BUCKETNAME);if (StringUtils.isEmpty(token)) {System.out.println("未获取到token,请重试!");return null;}String imageName ="fileupload/" + UUID.randomUUID().toString().replaceAll("-","")+"."+ext;System.out.println("File name = " + imageName);Response res = uploadManager.put(file, imageName, token,null,null);// 打印返回的信息if (res.isOK()) {Map map = JSON.parseObject(res.bodyString(), Map.class);return map.get("key").toString();}} catch (QiniuException e) {Response r = e.response;// 请求失败时打印的异常的信息e.printStackTrace();log.error("error " + r.toString());try {// 响应的文本信息log.error(r.bodyString());} catch (QiniuException e1) {log.error("error " + e1.error());}}return null;}/*** 上传** @param file* @return* @throws IOException*/public static String uploadFile(byte[] file, String ext) throws IOException {// 创建上传对象,Zone*代表地区Region region = Region.region2();Configuration configuration = new Configuration(region);UploadManager uploadManager = new UploadManager(configuration);try {// 调用put方法上传String token = AUTH.uploadToken(BUCKETNAME);if (StringUtils.isEmpty(token)) {System.out.println("未获取到token,请重试!");return null;}ByteArrayOutputStream output = new ByteArrayOutputStream();byte[] buffer = new byte[4096];int n = 0;
//            while (-1 != (n = file.read(buffer))) {
//                output.write(buffer, 0, n);
//            }String fileName ="excelFile/" + UUID.randomUUID().toString().replaceAll("-","")+"."+ext;System.out.println("File name = " + fileName);Response res = uploadManager.put(file, fileName, token);// 打印返回的信息if (res.isOK()) {Map map = JSON.parseObject(res.bodyString(), Map.class);return map.get("key").toString();}} catch (QiniuException e) {Response r = e.response;// 请求失败时打印的异常的信息e.printStackTrace();log.error("error " + r.toString());try {// 响应的文本信息log.error(r.bodyString());} catch (QiniuException e1) {log.error("error " + e1.error());}}finally {
//            output.close();}return null;}public static String uploadFileStream(InputStream inputStream, String ext) throws IOException {// 创建上传对象,Zone*代表地区Region region = Region.region2();Configuration configuration = new Configuration(region);UploadManager uploadManager = new UploadManager(configuration);try {// 调用put方法上传String token = AUTH.uploadToken(BUCKETNAME);if (StringUtils.isEmpty(token)) {System.out.println("未获取到token,请重试!");return null;}String fileName ="excelFile/" + UUID.randomUUID().toString().replaceAll("-","")+"."+ext;System.out.println("File name = " + fileName);Response res = uploadManager.put(inputStream, fileName, token,null,null);// 打印返回的信息if (res.isOK()) {Map map = JSON.parseObject(res.bodyString(), Map.class);return map.get("key").toString();}} catch (QiniuException e) {Response r = e.response;// 请求失败时打印的异常的信息e.printStackTrace();log.error("error " + r.toString());try {// 响应的文本信息log.error(r.bodyString());} catch (QiniuException e1) {log.error("error " + e1.error());}}finally {inputStream.close();}return null;}/*** 下载数据* @param fileUrl* @return* @throws IOException*/public  byte[] download(String fileUrl) throws IOException {ResponseEntity<byte[]> res = restTemplate.exchange(fileUrl, HttpMethod.GET, null, byte[].class);byte[] body = res.getBody();return body;}/*** 验证文件格式* @param fileName* @return*/public static boolean isFileAllowed(String fileName) {for (String ext : IMAGE_FILE_ETD) {if (ext.equals(fileName)) {return true;}}return false;}}

以上就是java导出导入excel表的过程,当中的难点解决方式,也希望有大佬指点一下,谢谢。

java实现excel导入导出,对象图片读取,上传七牛云相关推荐

  1. Java POI Excel导入导出

    Java POI Excel导入导出 1.maven引入依赖 2.导入Excel 3.导出Excel 1.maven引入依赖 <!-- POI Excel 操作 --> <depen ...

  2. java 图片回显_java实现Simditor图片上传七牛云并回显

    首先呢,我们有这样一个需求: 当图片上传Simditor时,将其保存到七牛云上,然后并回显在我们的Simditor中. 首先,需要我们有一个七牛云帐号,并且配置Simditor富文本编辑器. 其次,我 ...

  3. Java实现Excel导入导出操作详解

    前言 本次封装是基于 POI 的二次开发,最终使用只需要调用一个工具类中的方法,就能满足业务中绝大部门的导入和导出需求. 1. 功能测试 1.1 测试准备 在做测试前,我们需要將[2. 环境准备]中的 ...

  4. 【飞秋】ASP.NET 之 常用类、方法的超级总结,并包含动态的EXCEL导入导出功能,奉上类库源码

    最近闲了,花点几天时间将项目中常用的一些类.方法做了一下总结,希望对大家有用. 实用类:UtilityClass 包含如下方法 判断对象是否为空或NULL,如果是空或NULL返回true,否则返回fa ...

  5. java实现excel导入导出(jxl),Java面试题及解析

    */ public interface ExcelService { void export(HttpServletResponse response, HttpServletRequest requ ...

  6. java实现excel导入导出(jxl),Java入门你值得拥有

    private ExcelService excelService = new ExcelJxlServiceImpl(); @Autowired private ObjectMapper objec ...

  7. Java实现Excel导入导出操作

    java 对excel的导入及导出 最近在做对excel的导入导出,在平常的工作中,导入导出excel数据是常见的需求,今天就简单的记录一下Java是如何来实现这个功能的,感兴趣或者正好大家在工作中遇 ...

  8. Java实现Excel导入导出

    1.Excel导入 总结一下目标,就是要将excel中的数据行.逐一提取,最后得到一个list,这个list的每个元素就是excel的每个数据行的实例,之后的操作就是常规的java逻辑处理了. 可以把 ...

  9. Java操作Excel导入导出(EasyExcel)

    在管理一个系统时,总会有许多的数据,为了方便浏览查看数据,系统总会提供「导出Excel」的功能:有导出就有导入,在要向数据库中插入大量的数据时,我们向程序提供准备好的 Excel,然后程序读取表格内容 ...

最新文章

  1. 【进阶玩法】Angular用emit()实现类似Vue.js的v-model双向绑定[(ngModel)]功能
  2. SAP_SD_客户退货需要做哪些处理
  3. kafka消费者和生产者为内/外网映射情况的配置
  4. HDU4367(线段相交与斐波那契数列)
  5. 我的Java设计模式-建造者模式
  6. eShopOnContainers 是一个基于微服务的.NET Core示例框架
  7. python对时间日期做格式化
  8. linux怎样自动检查link文件_怎样理解和识别 Linux 中的文件类型 | Linux 中国
  9. Java 算法 特殊的数字四十
  10. 不要在网站上无限滚动!
  11. oracle 概念复习,oracle复习整理
  12. ssh图示+hibernate图示
  13. 状态机编程实例及适用范围
  14. 浩辰云建筑2021功能详细介绍
  15. 基于OPENCV的图像识别(JAVA版本)
  16. AI Illustrator 中钢笔工具在绘制过程中如何使用
  17. C语言大作业-个人通讯录管理系统、考试座位表生成系统、学生获奖信息收集与管理系统
  18. HM16.7量化部分学习记录
  19. 理解敏捷价值观(学习敏捷笔记)
  20. 【题解】JZOJ1321:灯

热门文章

  1. IceCTF - All your Base are belong to us
  2. IEC61850缩略语一览表
  3. 关于gl_FragCoord的理解
  4. MySQL索引、视图创建与管理操作实验
  5. Windows监控——性能指标详解
  6. 8.14. JSON Types
  7. 证监会叫停VR等行业跨界定增,福兮祸兮?
  8. 【弄nèng - Elasticsearch】运维篇 —— ES分片unassigned解决方案(ALLOCATION_FAILED,REPLICA_ADDED等
  9. TCP 底层处理流程图
  10. 【爬虫进阶】常见的反爬手段和解决方法(建议收藏)