• SpringBoot+若依+图片导出


    前言

    本文基于若依框架,实现excel中图片导出功能。

    自定义导出Excel数据注解

    1. public enum ColumnType{
    2. NUMERIC(0), STRING(1), IMAGE(2);
    3. private final int value;
    4. ColumnType(int value){
    5. this.value = value;
    6. }
    7. public int value(){
    8. return this.value;
    9. }
    10. }

     工具类中设置

    1. /**
    2. * 设置单元格信息
    3. *
    4. * @param value 单元格值
    5. * @param attr 注解相关
    6. * @param cell 单元格信息
    7. */
    8. public void setCellVo(Object value, Excel attr, Cell cell){
    9. if (Excel.ColumnType.STRING == attr.cellType()){
    10. String cellValue = Convert.toStr(value);
    11. // 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。
    12. if (StringUtils.startsWithAny(cellValue, FORMULA_STR)){
    13. cellValue = RegExUtils.replaceFirst(cellValue, FORMULA_REGEX_STR, "\t$0");
    14. }
    15. if (value instanceof Collection && StringUtils.equals("[]", cellValue)){
    16. cellValue = StringUtils.EMPTY;
    17. }
    18. cell.setCellValue(StringUtils.isNull(cellValue) ? attr.defaultValue() : cellValue + attr.suffix());
    19. }
    20. else if (Excel.ColumnType.NUMERIC == attr.cellType()){
    21. if (StringUtils.isNotNull(value)){
    22. cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value));
    23. }
    24. }
    25. else if (Excel.ColumnType.IMAGE == attr.cellType()){
    26. ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), cell.getRow().getRowNum() + 1);
    27. String imagePath = Convert.toStr(value);
    28. if (StringUtils.isNotEmpty(imagePath)){
    29. byte[] data = ImageUtils.getImage(imagePath);
    30. getDrawingPatriarch(cell.getSheet()).createPicture(anchor,
    31. cell.getSheet().getWorkbook().addPicture(data, getImageType(data)));
    32. }
    33. }
    34. }
    35. /**
    36. * 获取画布
    37. */
    38. public static Drawing getDrawingPatriarch(Sheet sheet){
    39. if (sheet.getDrawingPatriarch() == null){
    40. sheet.createDrawingPatriarch();
    41. }
    42. return sheet.getDrawingPatriarch();
    43. }
    44. /**
    45. * 获取图片类型,设置图片插入类型
    46. */
    47. public int getImageType(byte[] value){
    48. String type = FileTypeUtils.getFileExtendName(value);
    49. if ("JPG".equalsIgnoreCase(type)){
    50. return Workbook.PICTURE_TYPE_JPEG;
    51. }
    52. else if ("PNG".equalsIgnoreCase(type)){
    53. return Workbook.PICTURE_TYPE_PNG;
    54. }
    55. return Workbook.PICTURE_TYPE_JPEG;
    56. }

    图片处理工具类

    使用字节流,对图片文件进行处理

    1. import org.apache.poi.util.IOUtils;
    2. import org.slf4j.Logger;
    3. import org.slf4j.LoggerFactory;
    4. import java.io.ByteArrayInputStream;
    5. import java.io.InputStream;
    6. import java.net.URL;
    7. import java.net.URLConnection;
    8. import java.util.Arrays;
    9. /**
    10. * 图片处理工具类
    11. *
    12. *
    13. */
    14. public class ImageUtils {
    15. private static final Logger log = LoggerFactory.getLogger(ImageUtils.class);
    16. public static byte[] getImage(String imagePath) {
    17. InputStream is = getFile(imagePath);
    18. try {
    19. return IOUtils.toByteArray(is);
    20. } catch (Exception e) {
    21. log.error("图片加载异常 {}", e);
    22. return null;
    23. } finally {
    24. IOUtils.closeQuietly(is);
    25. }
    26. }
    27. public static InputStream getFile(String imagePath) {
    28. try {
    29. byte[] result = readFile(imagePath);
    30. result = Arrays.copyOf(result, result.length);
    31. return new ByteArrayInputStream(result);
    32. } catch (Exception e) {
    33. log.error("获取图片异常 {}", e);
    34. }
    35. return null;
    36. }
    37. /**
    38. * 读取文件为字节数据
    39. *
    40. * @param url 地址
    41. * @return 字节数据
    42. */
    43. public static byte[] readFile(String url) {
    44. InputStream in = null;
    45. try {
    46. // 网络地址
    47. URL urlObj = new URL(url);
    48. URLConnection urlConnection = urlObj.openConnection();
    49. urlConnection.setConnectTimeout(30 * 1000);
    50. urlConnection.setReadTimeout(60 * 1000);
    51. urlConnection.setDoInput(true);
    52. in = urlConnection.getInputStream();
    53. return IOUtils.toByteArray(in);
    54. } catch (Exception e) {
    55. log.error("访问文件异常 {}", e);
    56. return null;
    57. } finally {
    58. IOUtils.closeQuietly(in);
    59. }
    60. }
    61. }

    使用

    1. @Excel(name = "图片", cellType = Excel.ColumnType.IMAGE)
    2. private String pictureUrls;

    结果

  • 相关阅读:
    Swift SwiftUI 隐藏键盘
    01.爱芳地产项目小程序全栈项目经验(已上线)
    解决requests库中UnicodeError异常的问题
    Java自定义注解解析
    11. 关于linux下的挂载
    微信小程序如何使用scss,less
    网络爬虫——urllib(4)文末好书推荐
    Qt配置OpenCV(保姆级教程)
    C++实现std::bind
    Mysql数据库管理用户
  • 原文地址:https://blog.csdn.net/cx243698/article/details/132914842