构建 excel 文件并将其发送到客户端 jax-rs java
build excel file and send it to client jax-rs java
您好,我正在尝试从端点动态构建 excel 数据,然后使用 java JAX-RS
return 将其返回给我的客户端
所以现在我有一个简单的按钮可以调用我的函数,该函数可以访问这个 java 端点,我正在尝试使用 StringBuilder 来构建我想要 return 放置的数据将其发送到 CSV XLS 或其他任何内容,然后 return 发送给客户端。
@GET
@Path("/excelregisterbycountry")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response excelRegister(
@QueryParam("ModelNumber") String modelNbr,
@DefaultValue("US") @QueryParam("Country") String country) {
String myQuery = "";
try {
database = new EstateDatabaseManager(azureHost, azureDB);
} catch (Exception e) {
connectionFailed = true;
slrLog.write(DB_CONNECT_FAIL + e.getMessage());
}
if (!connectionFailed) {
myQuery = "SELECT distinct spr.country_code, spr.store_nbr, spr.register_nbr, spr.os_version_nbr, sco.adkversion, sco.termType, RTRIM(spr.bios_version_nbr), RTRIM(rt.model_nbr), st.store_type_desc, psi.os_level_id, psi.gsa_level_id, RTRIM(psi.self_checkout_type_cd), psi.si_level, psi.pf_level " +
"FROM str_pos_register2 spr " +
"JOIN register_type rt " +
"ON rt.register_type_cd = spr.register_type_cd " +
"join pos_store_info3 psi " +
"ON psi.country_code = spr.country_code " +
"AND psi.store_nbr = spr.store_nbr " +
"join store_type as st " +
"on psi.store_type_cd = st.store_type_cd " +
"Left join sco.daily sco " +
"on spr.register_nbr = sco.registernbr and spr.country_code = sco.countryCode and spr.store_nbr = sco.storeNbr and cast(spr.last_check_ts as date) = sco.reportDate " +
"WHERE spr.country_code <> '??' " +
"AND psi.store_status_code = 0 " +
"AND rt.model_nbr = ? " +
"AND spr.country_code = ? " +
"AND spr.last_check_ts > (CURRENT_TIMESTAMP -7) "+
"ORDER BY spr.store_nbr";
}
try {
StringBuilder sb = new StringBuilder();
sb.append("Country Code");
sb.append(",");
sb.append("Store Number");
sb.append(",");
sb.append("Register NUmber");
sb.append(",");
sb.append("OS Version");
sb.append(",");
sb.append("ADK Version");
sb.append(",");
sb.append("Term Type");
sb.append(",");
sb.append("Bios Version");
sb.append(",");
sb.append("Model Number");
sb.append(",");
sb.append("Store Type");
sb.append(",");
sb.append("OS Level ID");
sb.append(",");
sb.append("GSA Level ID");
sb.append(",");
sb.append("Self Checkout Ind");
sb.append(",");
sb.append("siLevel");
sb.append(",");
sb.append("pfLevel");
sb.append(",");
sb.append("\n");
trouxInfoScoRegisterObject[] dataObject = null;
List<trouxInfoScoRegisterObject> dataStore = new ArrayList<trouxInfoScoRegisterObject>();
trouxInfoScoRegisterObject trouxRegister = null;
PackageType<trouxInfoScoRegisterObject> t = new PackageType<>();
database.prepareSQL(myQuery);
database.addParameter(modelNbr, EstateDatabaseManager.TYPE_STRING);
database.addParameter(country, EstateDatabaseManager.TYPE_STRING);
database.query();
while (database.nextRow()) {
trouxRegister = new trouxInfoScoRegisterObject();
String countryCode = database.getColumn(1);
Integer storeNumber = database.getColumnInt(2);
Integer registerNumber = database.getColumnInt(3);
String osVersionNbr = database.getColumn(4);
String adkVersion = database.getColumn(5);
String termType = database.getColumn(6);
String biosVersionNbr = database.getColumn(7);
String ModelNumber = database.getColumn(8);
String storeType = database.getColumn(9);
String osLevelId = database.getColumn(10);
String gsaLevelId = database.getColumn(11);
String selfCheckoutInd = database.getColumn(12);
String siLevel = database.getColumn(13);
String pfLevel = database.getColumn(14);
sb.append(countryCode);
sb.append(",");
sb.append(storeNumber);
sb.append(",");
sb.append(registerNumber);
sb.append(",");
sb.append(osVersionNbr);
sb.append(",");
sb.append(adkVersion);
sb.append(",");
sb.append(termType);
sb.append(",");
sb.append(biosVersionNbr);
sb.append(",");
sb.append(ModelNumber);
sb.append(",");
sb.append(storeType);
sb.append(",");
sb.append(osLevelId);
sb.append(",");
sb.append(gsaLevelId);
sb.append(",");
sb.append(selfCheckoutInd);
sb.append(",");
sb.append(siLevel);
sb.append(",");
sb.append(pfLevel);
sb.append(",");
sb.append("\n");
}
FileWriter file = new FileWriter("test.csv");
file.append(sb.toString());
ResponseBuilder rb = Response.ok(file);
rb.header("content-disposition", "attachment; filename=rest-test.xlsx");
return rb.build();
}catch(Exception e) {
slrLog.write(NEXT_ROW_ERR + e.getMessage());
}
我正在尝试构建这一切,然后 return 将其返回给客户端我只想 return StringBuilder 构建成 CSV 格式的内容。一切运行顺利,直到 return 它说找不到源,因为当然,我在任何地方都没有 test.csv。我尝试只做 response.ok(sb.tostring())
但它只是 return 将我的数据以纯文本形式返回给客户端,而不是 CSV 或 excel 文件。如果有任何帮助,我将不胜感激。
不要因为是文件下载就使用application/octet-stream
。根据数据的实际情况使用正确的 MIME 类型。如果它是 CSV 文件,则使用 text/csv
因为这是标准的 1
@Produces("text/csv")
对于实体,只需 return 字符串。这就是您需要做的全部。不需要 File
或 FileWriter
或任何类型的中间存储。
return Response.ok(sb.toString())
.header(HttpHeaders.CONTENT_DISPOSITION,
"attachment;filename=test.csv")
.build();
就是这样。很简单。
请注意,CSV 和 Excel 文件不是一回事。 CSV 文件是文本文件,而 Excel 文件是二进制文件。您的数据是 CSV 数据,所以我不确定您为什么将文件名标记为 .xls
文件。应该是.csv
您好,我正在尝试从端点动态构建 excel 数据,然后使用 java JAX-RS
return 将其返回给我的客户端所以现在我有一个简单的按钮可以调用我的函数,该函数可以访问这个 java 端点,我正在尝试使用 StringBuilder 来构建我想要 return 放置的数据将其发送到 CSV XLS 或其他任何内容,然后 return 发送给客户端。
@GET
@Path("/excelregisterbycountry")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response excelRegister(
@QueryParam("ModelNumber") String modelNbr,
@DefaultValue("US") @QueryParam("Country") String country) {
String myQuery = "";
try {
database = new EstateDatabaseManager(azureHost, azureDB);
} catch (Exception e) {
connectionFailed = true;
slrLog.write(DB_CONNECT_FAIL + e.getMessage());
}
if (!connectionFailed) {
myQuery = "SELECT distinct spr.country_code, spr.store_nbr, spr.register_nbr, spr.os_version_nbr, sco.adkversion, sco.termType, RTRIM(spr.bios_version_nbr), RTRIM(rt.model_nbr), st.store_type_desc, psi.os_level_id, psi.gsa_level_id, RTRIM(psi.self_checkout_type_cd), psi.si_level, psi.pf_level " +
"FROM str_pos_register2 spr " +
"JOIN register_type rt " +
"ON rt.register_type_cd = spr.register_type_cd " +
"join pos_store_info3 psi " +
"ON psi.country_code = spr.country_code " +
"AND psi.store_nbr = spr.store_nbr " +
"join store_type as st " +
"on psi.store_type_cd = st.store_type_cd " +
"Left join sco.daily sco " +
"on spr.register_nbr = sco.registernbr and spr.country_code = sco.countryCode and spr.store_nbr = sco.storeNbr and cast(spr.last_check_ts as date) = sco.reportDate " +
"WHERE spr.country_code <> '??' " +
"AND psi.store_status_code = 0 " +
"AND rt.model_nbr = ? " +
"AND spr.country_code = ? " +
"AND spr.last_check_ts > (CURRENT_TIMESTAMP -7) "+
"ORDER BY spr.store_nbr";
}
try {
StringBuilder sb = new StringBuilder();
sb.append("Country Code");
sb.append(",");
sb.append("Store Number");
sb.append(",");
sb.append("Register NUmber");
sb.append(",");
sb.append("OS Version");
sb.append(",");
sb.append("ADK Version");
sb.append(",");
sb.append("Term Type");
sb.append(",");
sb.append("Bios Version");
sb.append(",");
sb.append("Model Number");
sb.append(",");
sb.append("Store Type");
sb.append(",");
sb.append("OS Level ID");
sb.append(",");
sb.append("GSA Level ID");
sb.append(",");
sb.append("Self Checkout Ind");
sb.append(",");
sb.append("siLevel");
sb.append(",");
sb.append("pfLevel");
sb.append(",");
sb.append("\n");
trouxInfoScoRegisterObject[] dataObject = null;
List<trouxInfoScoRegisterObject> dataStore = new ArrayList<trouxInfoScoRegisterObject>();
trouxInfoScoRegisterObject trouxRegister = null;
PackageType<trouxInfoScoRegisterObject> t = new PackageType<>();
database.prepareSQL(myQuery);
database.addParameter(modelNbr, EstateDatabaseManager.TYPE_STRING);
database.addParameter(country, EstateDatabaseManager.TYPE_STRING);
database.query();
while (database.nextRow()) {
trouxRegister = new trouxInfoScoRegisterObject();
String countryCode = database.getColumn(1);
Integer storeNumber = database.getColumnInt(2);
Integer registerNumber = database.getColumnInt(3);
String osVersionNbr = database.getColumn(4);
String adkVersion = database.getColumn(5);
String termType = database.getColumn(6);
String biosVersionNbr = database.getColumn(7);
String ModelNumber = database.getColumn(8);
String storeType = database.getColumn(9);
String osLevelId = database.getColumn(10);
String gsaLevelId = database.getColumn(11);
String selfCheckoutInd = database.getColumn(12);
String siLevel = database.getColumn(13);
String pfLevel = database.getColumn(14);
sb.append(countryCode);
sb.append(",");
sb.append(storeNumber);
sb.append(",");
sb.append(registerNumber);
sb.append(",");
sb.append(osVersionNbr);
sb.append(",");
sb.append(adkVersion);
sb.append(",");
sb.append(termType);
sb.append(",");
sb.append(biosVersionNbr);
sb.append(",");
sb.append(ModelNumber);
sb.append(",");
sb.append(storeType);
sb.append(",");
sb.append(osLevelId);
sb.append(",");
sb.append(gsaLevelId);
sb.append(",");
sb.append(selfCheckoutInd);
sb.append(",");
sb.append(siLevel);
sb.append(",");
sb.append(pfLevel);
sb.append(",");
sb.append("\n");
}
FileWriter file = new FileWriter("test.csv");
file.append(sb.toString());
ResponseBuilder rb = Response.ok(file);
rb.header("content-disposition", "attachment; filename=rest-test.xlsx");
return rb.build();
}catch(Exception e) {
slrLog.write(NEXT_ROW_ERR + e.getMessage());
}
我正在尝试构建这一切,然后 return 将其返回给客户端我只想 return StringBuilder 构建成 CSV 格式的内容。一切运行顺利,直到 return 它说找不到源,因为当然,我在任何地方都没有 test.csv。我尝试只做 response.ok(sb.tostring())
但它只是 return 将我的数据以纯文本形式返回给客户端,而不是 CSV 或 excel 文件。如果有任何帮助,我将不胜感激。
不要因为是文件下载就使用
application/octet-stream
。根据数据的实际情况使用正确的 MIME 类型。如果它是 CSV 文件,则使用text/csv
因为这是标准的 1@Produces("text/csv")
对于实体,只需 return 字符串。这就是您需要做的全部。不需要
File
或FileWriter
或任何类型的中间存储。return Response.ok(sb.toString()) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=test.csv") .build();
就是这样。很简单。
请注意,CSV 和 Excel 文件不是一回事。 CSV 文件是文本文件,而 Excel 文件是二进制文件。您的数据是 CSV 数据,所以我不确定您为什么将文件名标记为 .xls
文件。应该是.csv