中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導出,在線文件導出)

SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導出,在線文件導出)

發布時間:2020-09-16 11:22:16 來源:腳本之家 閱讀:228 作者:雨developer 欄目:開發技術

在項目持續集成的過程中,有時候需要實現報表導出和文檔導出,類似于excel中這種文檔的導出,在要求不高的情況下,有人可能會考慮直接導出csv文件來簡化導出過程。但是導出xlsx文件,其實過程相對更復雜。解決方案就是使用poi的jar包。使用源生的poi來操作表格,代碼冗余,處理復雜,同時poi的相關聯的依賴還會存在版本兼容問題。所以直接使用poi來實現表格導出,維護成本大,不易于拓展。

我們需要學會站在巨人的肩膀上解決問題,jxls-poi這個就很好解決這個excel表格導出的多樣化的問題。類似jsp和thymealf的模板定義,使得表格導出變得簡單可控。

不多BB上代碼

1.引入關鍵依賴包

<!-- jxls-api依賴 -->
		<dependency>
			<groupId>org.jxls</groupId>
			<artifactId>jxls-poi</artifactId>
			<version>1.0.15</version>
		</dependency>

		<dependency>
			<groupId>org.jxls</groupId>
			<artifactId>jxls</artifactId>
			<version>2.4.6</version>
		</dependency>

這里只需要兩個依賴便操作excel表格了。

2.定義模板文件

SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導出,在線文件導出)

新建一個excel文件,后綴名為.xlsx,在resources目錄下新增一個jxls的文件夾,把模板文件放在這個文件夾下,便于后續的spring-boot的集成。

3.導出工具類

/**
 * @author machenike
 */
public class ExcelUtils {

  /***
   * excel導出到response
   * @param fileName   導出文件名
   * @param templateFile 模板文件地址
   * @param params     數據集合
   * @param response   response
   */
  public static void exportExcel(String fileName, InputStream templateFile, Map<String, Object> params,
                  HttpServletResponse response) throws IOException {
    response.reset();
    response.setHeader("Accept-Ranges", "bytes");
    OutputStream os = null;
    response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", fileName));
    response.setContentType("application/octet-stream;charset=UTF-8");
    try {
      os = response.getOutputStream();
      exportExcel(templateFile, params, os);
    } catch (IOException e) {
      throw e;
    }
  }

  /**
   * 導出excel到輸出流中
   * @param templateFile 模板文件
   * @param params 傳入參數
   * @param os 輸出流
   * @throws IOException
   */
  public static void exportExcel(InputStream templateFile, Map<String, Object> params, OutputStream os) throws IOException {
    try {
      Context context = new Context();
      Set<String> keySet = params.keySet();
      for (String key : keySet) {
        //設置參數變量
        context.putVar(key, params.get(key));
      }
      Map<String, Object> myFunction = new HashMap<>();
      myFunction.put("fun", new ExcelUtils());
      // 啟動新的jxls-api 加載自定義方法
      Transformer trans = TransformerFactory.createTransformer(templateFile, os);
      JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) trans.getTransformationConfig().getExpressionEvaluator();
      evaluator.getJexlEngine().setFunctions(myFunction);

      // 載入模板、處理導出
      AreaBuilder areaBuilder = new XlsCommentAreaBuilder(trans);
      List<Area> areaList = areaBuilder.build();
      areaList.get(0).applyAt(new CellRef("sheet1!A1"), context);
      trans.write();
    } catch (IOException e) {
      throw e;
    } finally {
      try {
        if (os != null) {
          os.flush();
          os.close();
        }
        if (templateFile != null) {
          templateFile.close();
        }
      } catch (IOException e) {
        throw e;
      }
    }
  }

  /**
   * 格式化時間
   */
  public Object formatDate(Date date) {
    if (date != null) {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      String dateStr = sdf.format(date);
      return dateStr;
    }
    return "--";
  }


  /**
   * 設置超鏈接方法
   */
  public WritableCellValue getLink(String address, String title) {
    return new WritableHyperlink(address, title);
  }
}

這個工具類中我定義兩個導出用的方法
一個是直接是HttpServletResponse 導出在線下載文件
一個使用輸入流導出
同時模板中還支持方法傳入。

4.定義導出服務類

全局配置jxls模板的基礎路徑

#jxls模板的基礎路徑
jxls.template.path: classpath:jxls/

定義服務接口

/**
 * excel用service
 */
public interface ExcelService {

  /**
   * 導出excel,寫入輸出流中
   * @param templateFile
   * @param params
   * @param os
   * @return
   */
  boolean getExcel(String templateFile,Map<String,Object> params, OutputStream os);

  /**
   * 導出excel,寫入response中
   * @param templateFile
   * @param fileName
   * @param params
   * @param response
   * @return
   */
  boolean getExcel(String templateFile,String fileName, Map<String,Object> params, HttpServletResponse response);

  /**
   * 導出excel,寫入文件中
   * @param templateFile
   * @param params
   * @param outputFile
   * @return
   */
  boolean getExcel(String templateFile, Map<String,Object> params, File outputFile);
}

excel導出用服務實現類

/**
 * excel用serviceImpl
 */
@Service
public class ExcelServiceImppl implements ExcelService {

  private static final Logger logger = LoggerFactory.getLogger(ExcelServiceImppl.class);

  /**
   * 模板文件的基礎路徑
   */
  @Value("${jxls.template.path}")
  private String templatePath;

  @Override
  public boolean getExcel(String templateFile, Map<String, Object> params, OutputStream os) {
    FileInputStream inputStream = null;
    try {
      //獲取模板文件的輸入流
      inputStream = new FileInputStream(ResourceUtils.getFile(templatePath + templateFile));
      //導出文件到輸出流
      ExcelUtils.exportExcel(inputStream, params, os);
    } catch (IOException e) {
      logger.error("excel export has error" + e);
      return false;
    }
    return true;
  }

  @Override
  public boolean getExcel(String templateFile, String fileName, Map<String, Object> params, HttpServletResponse response) {
    FileInputStream inputStream = null;
    try {
      //獲取模板文件的輸入流
      inputStream = new FileInputStream(ResourceUtils.getFile(templatePath + templateFile));
      //導出文件到response
      ExcelUtils.exportExcel(fileName,inputStream,params,response);
    } catch (IOException e) {
      logger.error("excel export has error" + e);
      return false;
    }
    return true;
  }

  @Override
  public boolean getExcel(String templateFile, Map<String, Object> params, File outputFile) {
    FileInputStream inputStream = null;
    try {
      //獲取模板文件的輸入流
      inputStream = new FileInputStream(ResourceUtils.getFile(templatePath + templateFile));
      File dFile = outputFile.getParentFile();
      //文件夾不存在時創建文件夾
      if(dFile.isDirectory()){
        if(!dFile.exists()){
          dFile.mkdir();
        }
      }
      //文件不存在時創建文件
      if(!outputFile.exists()){
        outputFile.createNewFile();
      }
      //導出excel文件
      ExcelUtils.exportExcel(inputStream, params, new FileOutputStream(outputFile));
    } catch (IOException e) {
      logger.error("excel export has error" + e);
      return false;
    }
    return true;
  }
}

如上,服務類提供了,三種導出的實現方法

  • 導出excel寫入response中
  • 導出excel寫入輸出流中
  • 導出excel寫入文件中

這三種方法足以覆蓋所有的業務需求

5.編輯jxls模板

這里為方便導出最好定義與模板匹配的實體類,便于數據的裝載和導出

public class UserModel {

  private Integer id;

  private String name;

  private String sex;

  private Integer age;

  private String remark;

  private Date date;

  private String link;
  }

SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導出,在線文件導出)

插入標注定義模板,定義迭代對象jx:each

jx:each(items="list" var="item" lastCell="G3")

上面G3 模板中迭代的結束位置,然后用類似EL表達式的方式填充到模板當中

SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導出,在線文件導出)

填寫范圍jx:area

jx:area(lastCell="G3")

模板編輯完成后保存即可,

6.代碼測試使用

導出為本地文件

@SpringBootTest
class BlogJxlsApplicationTests {

  @Autowired
  ExcelService excelService;

  @Test
  void contextLoads() {
    Map<String, Object> params = new HashMap();
    List<UserModel> list = new ArrayList<>();
    list.add(new UserModel(1, "test01", "男", 25, "tttttttttt",new Date(),"htpp://wwww.baidu.com"));
    list.add(new UserModel(2, "test02", "男", 20, "tttttttttt",new Date(),"htpp://wwww.baidu.com"));
    list.add(new UserModel(3, "test04", "女", 25, "ttttddddasdadatttttt",new Date(),"htpp://wwww.baidu.com"));
    list.add(new UserModel(4, "test08", "男", 20, "ttttttdasdatttt",new Date(),"htpp://wwww.baidu.com"));
    list.add(new UserModel(5, "test021", "女", 25, "ttttdatttttt",new Date(),"htpp://wwww.baidu.com"));
    list.add(new UserModel(7, "test041", "男", 25, "ttdadatttttttt",new Date(),"htpp://wwww.baidu.com"));

		params.put("list", list);
    excelService.getExcel("t1.xlsx", params, new File("D:\\test05.xlsx"));
  }
}

導出成功

SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導出,在線文件導出)

在線導出文件

@RestController
public class TestController {
  @Autowired
  ExcelService excelService;

  @RequestMapping("test")
  public void testFile(HttpServletResponse response){
    Map<String, Object> params = new HashMap();
    List<UserModel> list = new ArrayList<>();
    list.add(new UserModel(1, "test01", "男", 25, "tttttttttt",new Date(),"htpp://wwww.baidu.com"));
    list.add(new UserModel(2, "test02", "男", 20, "tttttttttt",new Date(),"htpp://wwww.baidu.com"));
    list.add(new UserModel(3, "test04", "女", 25, "ttttddddasdadatttttt",new Date(),"htpp://wwww.baidu.com"));
    list.add(new UserModel(4, "test08", "男", 20, "ttttttdasdatttt",new Date(),"htpp://wwww.baidu.com"));
    list.add(new UserModel(5, "test021", "女", 25, "ttttdatttttt",new Date(),"htpp://wwww.baidu.com"));
    list.add(new UserModel(7, "test041", "男", 25, "ttdadatttttttt",new Date(),"htpp://wwww.baidu.com"));

    params.put("list", list);
    excelService.getExcel("t1.xlsx",System.currentTimeMillis()+".xlsx", params,response);
  }
}

SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導出,在線文件導出)

導出成功

SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導出,在線文件導出)

SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導出,在線文件導出)

源碼地址
https://github.com/DavidLei08/BlogJxls.git

到此這篇關于SpringBoot快速集成jxls-poi(自定義模板,支持本地文件導出,在線文件導出)的文章就介紹到這了,更多相關SpringBoot集成jxls-poi內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

齐齐哈尔市| 鹿泉市| 乌恰县| 靖宇县| 嘉兴市| 洛宁县| 肥城市| 黑山县| 宝山区| 黄平县| 南阳市| 顺义区| 遂宁市| 溧阳市| 比如县| 常山县| 博罗县| 平谷区| 珲春市| 库车县| 苏州市| 沅陵县| 疏附县| 清苑县| 曲沃县| 芮城县| 奉贤区| 方正县| 蒙阴县| 丹阳市| 扎赉特旗| 安溪县| 三门县| 建瓯市| 饶河县| 莱州市| 新巴尔虎右旗| 汝南县| 拜泉县| 柯坪县| 南平市|