导出csv功能1

This commit is contained in:
wenlukang1 2025-07-28 17:37:04 +08:00
parent 7b085cb5ff
commit fe5c64a665
7 changed files with 170 additions and 18 deletions

View File

@ -3,21 +3,15 @@ package shkd.sys.sys.plugin.report;
import kd.bos.algo.DataSet;
import kd.bos.algo.JoinDataSet;
import kd.bos.algo.JoinType;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.db.DB;
import kd.bos.db.DBRoute;
import kd.bos.entity.report.AbstractReportListDataPlugin;
import kd.bos.entity.report.FastFilter;
import kd.bos.entity.report.FilterItemInfo;
import kd.bos.entity.report.ReportQueryParam;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.orm.ORM;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.QueryServiceHelper;
import kd.bos.util.CollectionUtils;
import shkd.sys.sys.plugin.report.util.ReportUtils;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

View File

@ -12,6 +12,7 @@ import kd.bos.orm.query.QFilter;
import kd.bos.permission.api.HasPermOrgResult;
import kd.bos.servicehelper.QueryServiceHelper;
import kd.bos.servicehelper.permission.PermissionServiceHelper;
import shkd.sys.sys.plugin.report.util.ReportUtils;
import java.util.Arrays;
import java.util.Collections;

View File

@ -5,28 +5,23 @@ import kd.bos.algo.JoinDataSet;
import kd.bos.algo.JoinType;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.entity.LocaleString;
import kd.bos.db.DB;
import kd.bos.db.DBRoute;
import kd.bos.entity.MainEntityType;
import kd.bos.entity.report.*;
import kd.bos.entity.tree.TreeNode;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.org.model.OrgTreeBuildType;
import kd.bos.org.model.OrgTreeParam;
import kd.bos.orm.ORM;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.MetadataServiceHelper;
import kd.bos.servicehelper.QueryServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper;
import kd.bos.servicehelper.org.OrgUnitServiceHelper;
import kd.bos.servicehelper.org.OrgViewType;
import kd.bos.util.CollectionUtils;
import shkd.sys.sys.plugin.form.PaymentProcessingBillPlugin;
import shkd.sys.sys.plugin.report.domain.FinanceVarietyEnum;
import shkd.sys.sys.plugin.report.util.ReportUtils;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;

View File

@ -6,23 +6,20 @@ import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.db.DB;
import kd.bos.db.DBRoute;
import kd.bos.entity.report.AbstractReportListDataPlugin;
import kd.bos.entity.report.FastFilter;
import kd.bos.entity.report.FilterItemInfo;
import kd.bos.entity.report.ReportQueryParam;
import kd.bos.entity.tree.TreeNode;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.org.model.OrgTreeBuildType;
import kd.bos.org.model.OrgTreeParam;
import kd.bos.orm.ORM;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.QueryServiceHelper;
import kd.bos.servicehelper.org.OrgUnitServiceHelper;
import kd.bos.servicehelper.org.OrgViewType;
import kd.bos.util.CollectionUtils;
import shkd.sys.sys.plugin.report.domain.FinanceVarietyEnum;
import shkd.sys.sys.plugin.report.util.ReportUtils;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;

View File

@ -0,0 +1,82 @@
package shkd.sys.sys.plugin.report.util;
import com.opencsv.CSVWriter;
import java.nio.charset.StandardCharsets;
import java.util.Collection;
import java.util.List;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
public class CsvExportUtil {
/**
* 通用 CSV 导出
*
* @param os 输出流可以是 FileOutputStream / response.getOutputStream()
* @param headers 表头可为 null
* @param rows 数据每行是一个 List<Object>元素自动 toString()
* @throws IOException IO 异常
*/
public static void writeCsv(OutputStream os,
List<String> headers,
Collection<? extends List<?>> rows) throws IOException {
try (CSVWriter writer = new CSVWriter(
new OutputStreamWriter(os, StandardCharsets.UTF_8))) {
// 1. 表头
if (headers != null && !headers.isEmpty()) {
writer.writeNext(headers.toArray(new String[0]));
}
// 2. 内容
for (List<?> row : rows) {
String[] line = row.stream()
.map(e -> e == null ? "" : e.toString())
.toArray(String[]::new);
writer.writeNext(line);
}
writer.flush();
}
}
/**
* 把数据直接写进磁盘文件
*
* @param targetFile 目标文件路径 Paths.get("/tmp/report.csv")
* @param headers 表头可为 null
* @param rows 数据行
*/
public static void writeCsvToFile(Path targetFile,
List<String> headers,
Collection<? extends List<?>> rows) throws IOException {
// 自动创建父目录
Files.createDirectories(targetFile.getParent());
try (BufferedWriter bw = Files.newBufferedWriter(targetFile,
StandardCharsets.UTF_8);
CSVWriter writer = new CSVWriter(bw)) {
// 1. 表头
if (headers != null && !headers.isEmpty()) {
writer.writeNext(headers.toArray(new String[0]));
}
// 2. 数据
for (List<?> row : rows) {
String[] line = row.stream()
.map(e -> e == null ? "" : e.toString())
.toArray(String[]::new);
writer.writeNext(line);
}
writer.flush();
}
}
}

View File

@ -0,0 +1,83 @@
package shkd.sys.sys.plugin.report.util;
import dm.jdbc.util.StringUtil;
import kd.bos.cache.CacheFactory;
import kd.bos.cache.TempFileCache;
import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
import kd.bos.entity.MainEntityType;
import kd.bos.entity.report.IReportListModel;
import kd.bos.form.control.Toolbar;
import kd.bos.form.control.events.ItemClickEvent;
import kd.bos.report.ReportList;
import kd.bos.report.plugin.AbstractReportFormPlugin;
import org.apache.commons.io.FileUtils;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.Date;
import java.util.EventObject;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class ExportCSV extends AbstractReportFormPlugin {
@Override
public void registerListener(EventObject e) {
super.registerListener(e);
// 获取工具栏监听整个工具栏
Toolbar export = this.getView().getControl("toolbarap");
// 监听工具栏这个按钮的点击事件
export.addItemClickListener(this);
export.addClickListener(this);
}
@Override
public void itemClick(ItemClickEvent evt) {
super.itemClick(evt);
String itemKey = evt.getItemKey();
if (StringUtil.equals("shkd_exportcsv",itemKey)){
MainEntityType dataEntityType = this.getModel().getDataEntityType();
DataEntityPropertyCollection properties = dataEntityType.getProperties();
String reportName = dataEntityType.getDisplayName().getLocaleValue();
// List<String> header = properties.stream()
// .map(o -> o.getDisplayName().getLocaleValue())
// .collect(Collectors.toList());
String timestamp = LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("yyyyMMddHHmm"));
int random = ThreadLocalRandom.current().nextInt(100, 1000); // 3 位随机数
String reportNameExt = timestamp + random;
IReportListModel reportList = ((ReportList) this.getControl("reportlistap")).getReportModel();
int rowCount = reportList.getRowCount();
List<Object> rows = IntStream.range(1, rowCount)
.mapToObj(reportList::getRowData)
.collect(Collectors.toList());
try {
// DateUtils.get
Path tempFile = Files.createTempFile(reportName + reportNameExt, ".csv");
CsvExportUtil.writeCsvToFile(tempFile,null, Collections.singleton(rows));
// 上传到临时文件服务器 获取压缩包下载地址
TempFileCache tempFileCache = CacheFactory.getCommonCacheFactory().getTempFileCache();
String url = tempFileCache.saveAsUrl(tempFile.getFileName().toString(), Files.newInputStream(tempFile), 3 * 60);
// 下载压缩包
this.getView().download(url);
Files.delete(tempFile);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}

View File

@ -1,4 +1,4 @@
package shkd.sys.sys.plugin.report;
package shkd.sys.sys.plugin.report.util;
import kd.bos.entity.report.FastFilter;
import kd.bos.entity.report.FilterItemInfo;