文章目錄
- 前言
- 依賴引入
- 繪制 jxls 批注的 excel 模板
- 測試類編寫
- 自定義命令
- 關于自動換行
前言
之前的博客中都簡單說了數據的渲染和導出excel文件。包括固定的 表頭結構
,以及動態 表頭和表數據
等方式。
本篇博客主要說明自定義命令
的方式,控制輸出excel文件每行記錄的行高
。
依賴引入
主要依賴以及版本如下所示:
<dependency><groupId>org.jxls</groupId><artifactId>jxls</artifactId><version>2.4.5</version>
</dependency>
<dependency><!-- 可以使用poi的實現也可以用jexcelapi的 --><groupId>org.jxls</groupId><artifactId>jxls-poi</artifactId><version>1.0.15</version>
</dependency>
<dependency><groupId>org.jxls</groupId><artifactId>jxls-jexcel</artifactId><version>1.0.7</version>
</dependency>
<dependency><groupId>net.sf.jxls</groupId><artifactId>jxls-core</artifactId><version>1.0.6</version>
</dependency>
繪制 jxls 批注的 excel 模板
其中兩個批注分別如下:
-
整體數據范圍:
Administrator:
jx:area(lastCell=”H3”) -
列表數據渲染范圍:
Administrator:
jx:each(items=“bDatas” var=“vo” lastCell=“H3” varIndex=“ojbIndex” )
測試類編寫
編寫一個簡單的數據填充邏輯,并生成對應的excel文件。代碼如下所示:
import cn.xj.test.UserPo;
import com.google.common.collect.Lists;
import org.jxls.builder.xls.XlsCommentAreaBuilder;
import org.jxls.common.Context;
import org.jxls.util.JxlsHelper;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;import java.io.*;
import java.util.*;public class Test1 {public static void main(String[] args) throws IOException {Context context = new Context();// 數據集合List<UserPo> dataList = Lists.newArrayList();for (int i = 0; i < 10; i++) {UserPo userPo = new UserPo();userPo.setNum("1_"+i);userPo.setName("xj_"+i);userPo.setAge(i+1);userPo.setMail("專注寫bug測試中文11111");dataList.add(userPo);}// ${item.num}context.putVar("bDatas",dataList);// 模板文件再resources 目錄下Resource resource = new ClassPathResource("/report/test_user1.xlsx");InputStream is = resource.getInputStream();String outFile = System.getProperty("user.dir")+ File.separator+"springboot-poi"+File.separator+"pdf"+File.separator+System.currentTimeMillis()+ ".xlsx";OutputStream outputStream = new FileOutputStream(outFile);JxlsHelper jxlsHelper = JxlsHelper.getInstance();jxlsHelper.getAreaBuilder().getTransformer();jxlsHelper.processTemplate(is, outputStream, context);// JxlsHelper.getInstance().processTemplate(is, outputStream, context);}
}
執行后,生成excel文件中內容的效果如下所示:
每行的行高太大,畢竟再模板中就是配置的這么大,顯得很散亂。此時則可以使用自定義命令
的方式,動態地修改行高
。
自定義命令
jxls中自定義命令,可以采取繼承 AbstractCommand 類
實現。自定義命令需要定義命令名稱
和命令邏輯
。如下所示:
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.jxls.area.Area;
import org.jxls.command.AbstractCommand;
import org.jxls.common.CellRef;
import org.jxls.common.Context;
import org.jxls.common.Size;
import org.jxls.transform.poi.PoiTransformer;/*** 自定義列高指令* 如:* jx:autoRowHeight(lastCell ="C3")** 還需要在對應的主程序中調用*/
public class AutoRowHeightCommand extends AbstractCommand {/*** 批注中的自定義指令* @return*/@Overridepublic String getName() {return "autoRowHeight";}/*** 列高邏輯* @param cellRef* @param context* @return*/@Overridepublic Size applyAt(CellRef cellRef, Context context) {Area area=getAreaList().get(0);Size size = area.applyAt(cellRef, context);PoiTransformer transformer = (PoiTransformer) area.getTransformer();Sheet sheet = transformer.getWorkbook().getSheet(cellRef.getSheetName());
// List bDatas = (List) context.getVar("bDatas");
// int firstDefaultCol = cellRef.getCol(); // 最開始的第一列
// if(!CollectionUtils.isEmpty(bDatas)){
// for (int i = 0; i < bDatas.size(); i++) {
// // 計算中文、字符的長度 設定列寬
// Object data = bDatas.get(i);
// if(!StringUtils.isEmpty(data) && (data.getBytes().length+4)>sheet.getColumnWidth(i)){
// sheet.setColumnWidth(i+firstDefaultCol,data.getBytes().length+4);
// }else{
// sheet.setColumnWidth(i+firstDefaultCol,30); // 默認
// }
//
// }
// }//sheet.setColumnWidth(cellRef.getCol(),50);Row row = sheet.getRow(cellRef.getRow());row.setHeight((short) -1);return size;}
}
自定義命令后,需要再模板中增加命令的標識,否則不會生效。
jx:autoRowHeight(lastCell =“H3”)
其次,還需要再調用jxls做填充渲染之前,補充命令和邏輯的調用。
import cn.xj.jxls.AutoRowHeightCommand;
import cn.xj.test.UserPo;
import com.google.common.collect.Lists;
import org.jxls.builder.xls.XlsCommentAreaBuilder;
import org.jxls.common.Context;
import org.jxls.util.JxlsHelper;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;import java.io.*;
import java.util.*;public class Test1 {public static void main(String[] args) throws IOException {Context context = new Context();// 數據集合List<UserPo> dataList = Lists.newArrayList();for (int i = 0; i < 10; i++) {UserPo userPo = new UserPo();userPo.setNum("1_"+i);userPo.setName("xj_"+i);userPo.setAge(i+1);userPo.setMail("專注寫bug測試中文11111");dataList.add(userPo);}// ${item.num}context.putVar("bDatas",dataList);// 模板文件再resources 目錄下Resource resource = new ClassPathResource("/report/test_user1.xlsx");InputStream is = resource.getInputStream();String outFile = System.getProperty("user.dir")+ File.separator+"springboot-poi"+File.separator+"pdf"+File.separator+System.currentTimeMillis()+ ".xlsx";OutputStream outputStream = new FileOutputStream(outFile);JxlsHelper jxlsHelper = JxlsHelper.getInstance();jxlsHelper.getAreaBuilder().getTransformer();// 渲染前 載入 自定義 命令XlsCommentAreaBuilder.addCommandMapping("autoRowHeight", AutoRowHeightCommand.class);jxlsHelper.processTemplate(is, outputStream, context);}
}
執行后的效果如下所示:
關于自動換行
jxls沒有對應的自動換行
操作,但是jxls可以在模板中定義對應的單元格樣式。只需要在模板中對需要做自動換行的列增加如下配置。
再次執行上述的代碼邏輯,查看顯示效果。