Java實(shí)現(xiàn)根據(jù)sql動(dòng)態(tài)查詢并下載數(shù)據(jù)到excel
需求
由于生產(chǎn)數(shù)據(jù)庫不能直接連接下載數(shù)據(jù),所以需要在監(jiān)控系統(tǒng)上做一個(gè)根據(jù)sql動(dòng)態(tài)查詢并下載數(shù)據(jù)的功能。
實(shí)現(xiàn)思路
寫一個(gè)接口,傳入需要查詢的數(shù)據(jù)庫信息和sql,將查詢的接口導(dǎo)出到Excel中
實(shí)現(xiàn)細(xì)節(jié)
入?yún)?/p>
@Data
public class ExportDataReq {
/**
* "jdbc:mysql://localhost:3306/your_database";
*/
@NotEmpty
String url;
@NotEmpty
String user;
@NotEmpty
String password;
@NotEmpty
String sql;
@NotEmpty
String[] titles;
}controller
@Slf4j
@Controller
@RequestMapping("/export/")
public class ExportController {
@Autowired
ExportService exportService;
@ApiOperation(value = "下載數(shù)據(jù)信息", notes = "日期格式:yyyy-MM-dd", httpMethod = "POST")
@PostMapping(value = "/exportData")
@ResponseBody
public BaseResponse exportData(@RequestBody @Valid ExportDataReq req,HttpServletResponse response) {
BaseResponse baseResponse = exportService.exportData(req, response);
return baseResponse;
}
}接口
public interface ExportService {
BaseResponse exportData(ExportDataReq req, HttpServletResponse response);
}服務(wù)
@Service
public class ExportServiceImpl implements ExportService {
@Override
public BaseResponse exportData(ExportDataReq req, HttpServletResponse response) {
try (Connection conn = DriverManager.getConnection(req.getUrl(), req.getUser(), req.getPassword());
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(req.getSql())) {
//創(chuàng)建wb
HSSFWorkbook wb = new HSSFWorkbook();
//創(chuàng)建sheet
HSSFSheet sheet = wb.createSheet("data");
//添加標(biāo)題
addTitle(sheet,req.getTitles());
//添加內(nèi)容
addRow(sheet,rs);
//導(dǎo)出
writeToResponse(response,wb,"data"+dateNow());
return ResponseUtils.success();
} catch (Exception ex) {
ex.printStackTrace();
return ResponseUtils.fail(ex.getMessage());
}finally {
}
}
protected void writeToResponse(HttpServletResponse response, HSSFWorkbook wb, String fileName) throws IOException {
response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName,"utf-8")+".xls");
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setCharacterEncoding("UTF-8");
OutputStream out = response.getOutputStream();
wb.write(out);
out.flush();
wb.close();
}
private void addRow(HSSFSheet sheet, ResultSet rs) throws SQLException {
ResultSetMetaData rsMetaData = rs.getMetaData();
int columnCount = rsMetaData.getColumnCount();
int rowNum = 1;
while (rs.next()) {
Row row = sheet.createRow(rowNum++);
for (int i = 1; i <= columnCount; i++) {
Cell cell = row.createCell(i - 1);
String columnName = rsMetaData.getColumnName(i);
switch (rsMetaData.getColumnType(i)) {
case Types.VARCHAR:
case Types.CHAR:
cell.setCellValue(rs.getString(columnName));
break;
case Types.INTEGER:
cell.setCellValue(rs.getInt(columnName));
break;
case Types.DOUBLE:
cell.setCellValue(rs.getDouble(columnName));
break;
// Add other types as needed
default:
cell.setCellValue(rs.getString(columnName));
}
}
}
}
private void addTitle(HSSFSheet sheet, String[] titles) {
HSSFRow row = sheet.createRow((int) 0);
for (int i=0;i<titles.length;i++) {
HSSFCell cell = row.createCell(i);
cell.setCellValue(titles[i]);
sheet.autoSizeColumn(i);//自動(dòng)設(shè)寬
}
}
private String dateNow(){
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddhhmmss");
return sdf.format(new java.util.Date());
}
}然后通過postman即可導(dǎo)出數(shù)據(jù),因?yàn)槿雲(yún)㈩愋捅容^復(fù)雜,sql可能較長,所以此處使用post請求。
測試
入?yún)?/p>
{"url":"jdbc:mysql://XXXX:63306/gac_order",
"user":"XXX",
"password":"xxx",
"sql":"select order_id,create_time,user_id,status from order_info limit 1000",
"titles":["order_id","create_time","user_id","status"]}postman send按鈕下拉的Send and Download 可以順利下載下數(shù)據(jù)
到此這篇關(guān)于Java實(shí)現(xiàn)根據(jù)sql動(dòng)態(tài)查詢并下載數(shù)據(jù)到excel的文章就介紹到這了,更多相關(guān)Java sql動(dòng)態(tài)查詢并下載數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker?DockerFile部署java?jar項(xiàng)目包及Mysql和Redis的詳細(xì)過程
Dockerfile是一種用于構(gòu)建Docker鏡像的文件格式,可以通過Dockerfile部署Java項(xiàng)目,這篇文章主要給大家介紹了關(guān)于Docker?DockerFile部署java?jar項(xiàng)目包及Mysql和Redis的詳細(xì)過程,需要的朋友可以參考下2023-12-12
強(qiáng)烈推薦MyBatis?三種批量插入方式的比較
這篇文章主要介紹了強(qiáng)烈推薦MyBatis?三種批量插入方式的比較,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07
web.xml中servlet, bean, filter, listenr 加載順序_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了web.xml中servlet, bean, filter, listenr 加載順序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Java 獲取當(dāng)前設(shè)備的 IP 地址(最新推薦)
Internet 協(xié)議 (IP) 地址可以是連接到 TCP/IP 網(wǎng)絡(luò)的每個(gè)設(shè)備的標(biāo)識符,該標(biāo)識符用于識別和定位中間通信的節(jié)點(diǎn),這篇文章主要介紹了在 Java 中獲取當(dāng)前設(shè)備的 IP 地址,需要的朋友可以參考下2023-06-06
Java經(jīng)驗(yàn)點(diǎn)滴:類注釋文檔編寫方法
Java經(jīng)驗(yàn)點(diǎn)滴:類注釋文檔編寫方法...2006-12-12
如何使用jenkins實(shí)現(xiàn)發(fā)布部分更新文件
這篇文章主要介紹了如何使用jenkins實(shí)現(xiàn)發(fā)布部分更新文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07

