Easy Excel 가족용 통
<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>${easyexcel.version}</version>
</dependency>
<easyexcel.version>1.1.2-beat1</easyexcel.version>
2. yml 구성
yml 구성 필요 없음
3. excel 코드
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.metadata.Sheet;
/**
*
*
* @param headerList
* @param list
* @param process
* @param tenantId id
* @param grantId id
* @return url
*/
public String uploadWithData(List<FieldBaseVO> headerList, List<Map<String, DataBaseVO>> list, Process process,
Long tenantId, Long grantId) {
try {
OutputStream out = new FileOutputStream(fileName);
ExcelWriter writer = EasyExcelFactory.getWriter(out);
//
Sheet sheet1 = getSheet(headerList);
writer.write1(generateFormData(headerList, list, process, tenantId, grantId), sheet1);
mergeNotList(writer, headerList, list);
writer.finish();
out.close();
} catch (FileNotFoundException e) {
process.setState(" ");
process.setDescription("FileNotFoundException");
processDao.update(process);
e.printStackTrace();
} catch (IOException e) {
process.setState(" ");
process.setDescription("IOException");
processDao.update(process);
e.printStackTrace();
}
return uploadTemplateByFile();
}
관련 주요 방법
/**
* sheet
*
* @param headerList
* @return sheet
*/
private Sheet getSheet(List<FieldBaseVO> headerList) {
//
Sheet sheet1 = new Sheet(1);
//
sheet1.setSheetName(" form ");
// header
// , header
int rowNumber = anysisRowNumber(headerList, 1);
// header
List<List<String>> head = transHeader(headerList, rowNumber);
sheet1.setHead(head);
return sheet1;
}
/**
* , ;
*
* @param headerList
* @param formDatas
* @param process
* @param tenantId id
* @param grantId
* @return
*/
private List<List<Object>> generateFormData(List<FieldBaseVO> headerList, List<Map<String, DataBaseVO>> formDatas,
Process process, Long tenantId, Long grantId) {
// ,
List<List<Object>> object = new ArrayList<>();
int count = 0;
for (Map<String, DataBaseVO> map : formDatas) {
int maxRowNumber = getFormDataRowNumber(map, headerList);
for (int i = 0; i < maxRowNumber; i++) {
// da , ;( , )
List<Object> da = new ArrayList<>();
for (FieldBaseVO f : headerList) {
//
if (!"list".equals(f.getType())) {
setDataList(toObjMap(map), f, da, tenantId, grantId);
} else {
// list mp;
List<FieldBaseVO> fields = ((TableVO) f).getFields();
// list,
if (map.containsKey(f.getName())) {
JSONObject jsVO = JSONObject.parseObject(JSONObject.toJSONString(map.get(f.getName())), JSONObject.class);
JSONArray jsArr = jsVO.getJSONArray("value");
List<Map<String, Object>> mpss = new ArrayList<>();
for (int j = 0; j < jsArr.size(); j++) {
//RowVo
JSONObject o = (JSONObject) jsArr.get(j);
JSONObject value = (JSONObject) o.get("value");
mpss.add(value.getInnerMap());
}
// tlist , data
for (FieldBaseVO fbv : fields) {
setDataList(mpss.get(i), fbv, da, tenantId, grantId);
}
}
}
}
object.add(da);
}
count++;
if (count != formDatas.size()) {
process.setState(" ");
process.setDescription(" ");
process.setRate(count + "/" + formDatas.size());
redisTemplate.boundHashOps(process.getTenantId()).put(process.getId(), JSON.toJSON(process));
}
}
return object;
}
/**
* list , list.size()
*
* @param writer ExcelWriter
* @param headerList
* @param formDatas
*/
private void mergeNotList(ExcelWriter writer, List<FieldBaseVO> headerList, List<Map<String, DataBaseVO>> formDatas) {
int headRow = anysisRowNumber(headerList, 1);
for (Map<String, DataBaseVO> map : formDatas) {
int maxRowNumber = getFormDataRowNumber(map, headerList);
if (maxRowNumber == 1) {
headRow = headRow + 1;
continue;
}
int colNumber = 0;
for (FieldBaseVO f : headerList) {
if (!"list".equals(f.getType())) {
writer.merge(headRow, headRow + maxRowNumber - 1, colNumber, colNumber);
colNumber++;
} else {
// list mp;
TableVO tableVO = (TableVO) f;
List<FieldBaseVO> fields = tableVO.getFields();
colNumber = colNumber + fields.size() + 1;
}
}
headRow = headRow + maxRowNumber;
}
}
/**
* , fastdfs
*
* @return fastdfs
*/
private String uploadTemplateByFile() {
String nginxUrl = "";
try {
File file = new File(fileName);
if (!file.exists()) {
file.createNewFile();
}
InputStream is = new FileInputStream(file);
String strBase64 = ioToBase64(is);
is.close();
FileTransferVo fileTransferVo = fileClient.upTemplate(strBase64, fileName);
nginxUrl = fileTransferVo.getPath();
file.delete();
} catch (IOException e) {
e.printStackTrace();
}
return nginxUrl;
}
/**
* fromData , //
*
* @param map formData ,
* @param headerList
* @return
*/
private int getFormDataRowNumber(Map<String, DataBaseVO> map, List<FieldBaseVO> headerList) {
int number = 1;
// list , number=1
for (int i = 0; i < headerList.size(); i++) {
if ("list".equals(headerList.get(i).getType())) {
break;
}
if (i == headerList.size() - 1) {
return number;
}
}
for (Map.Entry<String, DataBaseVO> m : map.entrySet()) {
JSONObject jb = JSONObject.parseObject(JSONObject.toJSONString(m.getValue()));
if ("list".equals(jb.getString("type"))) {
if (jb.getJSONArray("value").size() > number) {
number = jb.getJSONArray("value").size();
}
}
}
return number;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java 사용자 정의 주석 및 원리springmvcconfig에서 다음과 같은 선행 알림을 정의합니다. BeforeControllerInterceptor 코드는 다음과 같습니다. Annotation 정의는 다음과 같습니다. 1 사용자 정의 주석, @...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.