Compare commits

..

No commits in common. "715687e8d271853f592c166642ed6cecd7f64157" and "15a58a9c3bbbb3d274d5c09d197af35d118128ca" have entirely different histories.

4 changed files with 469 additions and 865 deletions

View File

@ -4,13 +4,13 @@ import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.security.SecureRandom;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.UUID;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.ServletOutputStream; import javax.servlet.ServletOutputStream;
@ -22,9 +22,6 @@ import org.apache.poi.ss.usermodel.Sheet;
import org.json.simple.JSONArray; import org.json.simple.JSONArray;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser; import org.json.simple.parser.JSONParser;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap; import org.springframework.ui.ModelMap;
@ -884,105 +881,67 @@ public class ConstructionProjectManagementController {
return null; return null;
} }
/** /**
* ( ) * CSV
* @param workbook * @param workbook
* @param request * @param request
* @param response * @param response
* @throws Exception * @throws Exception
*/ */
@RequestMapping(value = "admins/drilling/inquiry/excel.do") @RequestMapping(value = "admins/drilling/inquiry/excel.do")
public void downloadDrillingInquiryListExcel(HttpServletRequest request, HttpServletResponse response, @RequestParam HashMap<String, Object> params) throws Exception { public void downloadDrillingInquiryListExcel(HttpServletRequest request, HttpServletResponse response, HSSFWorkbook workbook, @RequestParam HashMap<String, Object> params) throws Exception {
// ========================= HashMap<String, Object> map = new HashMap<String, Object>();
// 1. 엑셀 헤더 정보 구성
// =========================
String[] headers = {
"cid","constName","projectStateCodeName","constStartDate",
"constStateCodeName","inquiryDist","masterCompanyDept",
"masterCompanyAdmin","masterCompanyTel","coinstCompanyDept",
"constCompanyAdmin","constCompanyTel"
};
String[][] headerNames = { String[] headers = {"cid","constName","projectStateCodeName","constStartDate","constStateCodeName","inquiryDist" ,"masterCompanyDept","masterCompanyAdmin","masterCompanyTel","coinstCompanyDept","constCompanyAdmin","constCompanyTel"};
{"연번", "사업명", "입력상태", "사업내용", "", "발주기관현황", "", "", "", "건설사현황", "", ""}, String[][] headerNames = {{"연번", "사업명", "입력상태", "사업내용", "", "발주기관현황", "", "", "", "건설사현황", "", ""},
{"", "", "", "사업기간", "사업단계", "발주처", "담당부서", {"", "", "", "사업기간", "사업단계", "발주처", "담당부서", "담당자", "담당자연락처", "건설사명", "담당자", "담당자연락처"}};
"담당자", "담당자연락처", "건설사명", "담당자", "담당자연락처"}
};
final int[] headerWidths = { final int[] headerWidths = {1325, 15900, 4240, 6360, 5830, 8830, 6890, 2915, 3710, 5035, 2915, 3710};
1325,15900,4240,6360,5830,8830, String[] columnType = {"String", "String", "String", "String", "String", "String", "String", "String", "String", "String", "String", "String"};
6890,2915,3710,5035,2915,3710 String sheetName = "Sheet1";
};
String[] columnType = { String excelFileName = "발주기관 건설현장 목록";
"String","String","String","String","String","String",
"String","String","String","String","String","String" // int startIndex = 0;
}; Long totalCount = 0L;
// DB 조회
String sheetName = "Sheet1";
String excelFileName = "발주기관 건설현장 목록";
// =========================
// 2. DB 조회
// =========================
JSONObject resultObj = drillingInquiryService.drillingInquiryList(request, params); JSONObject resultObj = drillingInquiryService.drillingInquiryList(request, params);
// 여기에서 list 꺼내기
List<EgovMap> list = (List<EgovMap>) resultObj.get("datas"); List<EgovMap> list = (List<EgovMap>) resultObj.get("datas");
Long totalCount = (Long) resultObj.get("count"); totalCount = (Long) resultObj.get("count");
// =========================
// 3. 데이터 없으면 리턴
// =========================
if (list == null || list.isEmpty()) {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("<script>alert('데이터가 없습니다.');</script>");
return;
}
// =========================
// 4. 리스트 후처리
// =========================
int idx = 0; int idx = 0;
for (EgovMap rowData : list) { for (EgovMap rowData : list) {
// 공사기간 형식 처리: startDate ~ endDate
String constStartDate = (String) rowData.get("constStartDate"); String constStartDate = (String) rowData.get("constStartDate");
String constEndDate = (String) rowData.get("constEndDate"); String constEndDate = (String) rowData.get("constEndDate");
rowData.put("constStartDate", constStartDate + " ~ " + constEndDate); // 공사기간을 'startDate ~ endDate' 형식으로 변환
rowData.put("constStartDate",
(constStartDate == null ? "" : constStartDate)
+ " ~ "
+ (constEndDate == null ? "" : constEndDate));
rowData.put("cid", (totalCount) - (idx++)); rowData.put("cid", (totalCount) - (idx++));
String inquiryDist = ""; String glName = "";
if (rowData.get("glName") != null) String gmName = "";
inquiryDist += rowData.get("glName") + " "; String gsName = "";
if (rowData.get("gmName") != null) String inquiryDist = ""; // 발주처
inquiryDist += rowData.get("gmName") + " "; if ((String)rowData.get("glName") != null) {
if (rowData.get("gsName") != null) glName = (String)rowData.get("glName");
inquiryDist += rowData.get("gsName"); inquiryDist = inquiryDist + glName + " ";
}if ((String)rowData.get("gmName") != null) {
rowData.put("inquiryDist", inquiryDist.trim()); gmName = (String)rowData.get("gmName");
inquiryDist = inquiryDist + gmName + " ";
}if ((String)rowData.get("gsName") != null) {
gsName = (String)rowData.get("gsName");
inquiryDist = inquiryDist + gsName;
}
rowData.put("inquiryDist", inquiryDist);
} }
// ========================= ExcelMergeHeaderUtil.listToExcelMergeHeader(list, response, headers, headerNames, headerWidths, columnType, sheetName, excelFileName);
// 5. 엑셀 유틸 호출
// =========================
ExcelMergeHeaderUtil.listToExcelMergeHeader(
list,
response,
headers,
headerNames,
headerWidths,
columnType,
sheetName,
excelFileName
);
} }
/** /**
* > * >
* @param params * @param params
@ -1153,5 +1112,5 @@ public class ConstructionProjectManagementController {
ExcelMergeHeaderUtil.listToExcelMergeHeaderForLoginHistory(resultList, response, headers, headerNames, headerWidths, columnType, sheetName, excelFileName); ExcelMergeHeaderUtil.listToExcelMergeHeaderForLoginHistory(resultList, response, headers, headerNames, headerWidths, columnType, sheetName, excelFileName);
} }
} }

View File

@ -1,8 +1,7 @@
package geoinfo.util; package geoinfo.util;
import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.time.LocalDate; import java.time.LocalDate;
@ -18,7 +17,6 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.FillPatternType; import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.HorizontalAlignment;
@ -26,554 +24,497 @@ import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment; import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFDataFormat; import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import egovframework.rte.psl.dataaccess.util.EgovMap; import egovframework.rte.psl.dataaccess.util.EgovMap;
public class ExcelMergeHeaderUtil { public class ExcelMergeHeaderUtil {
public static boolean isEmpty(final Object obj) {
return !isNotEmpty(obj);
}
public static boolean isNotEmpty(final Object obj) { public static boolean isEmpty(final Object obj) {
if (null == obj) return !isNotEmpty(obj);
return false; }
else {
if (obj instanceof String)
return "".equals(obj) ? false : true;
else if (obj instanceof List)
return !((List<?>) obj).isEmpty();
else if (obj instanceof Map)
return !((Map<?, ?>) obj).isEmpty();
// else if(obj instanceof Object[]) return 0 == Array.getLength(obj) ? false :
// true;
else if (obj instanceof Integer)
return !(null == obj);
else if (obj instanceof Long)
return !(null == obj);
else if (obj instanceof LocalDate)
return !(null == obj);
else
return false;
}
}
public static String getTimeStampString(final String format) { public static boolean isNotEmpty(final Object obj) {
return getTimeStampString(new Date(), format); if(null == obj) return false;
} else {
if(obj instanceof String) return "".equals(obj) ? false : true;
else if(obj instanceof List) return !((List<?>)obj).isEmpty();
else if(obj instanceof Map) return !((Map<?,?>)obj).isEmpty();
// else if(obj instanceof Object[]) return 0 == Array.getLength(obj) ? false : true;
else if(obj instanceof Integer) return !(null == obj);
else if(obj instanceof Long) return !(null == obj);
else if(obj instanceof LocalDate) return !(null == obj);
else return false;
}
}
public static String getTimeStampString(final Date date) { public static String getTimeStampString(final String format) {
return getTimeStampString(date, "yyyyMMddHHmmss"); return getTimeStampString(new Date(), format);
} }
public static String getTimeStampString(final Date date, final String format) { public static String getTimeStampString(final Date date) {
java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat(format, java.util.Locale.KOREA); return getTimeStampString(date, "yyyyMMddHHmmss");
return formatter.format(date); }
}
public static String getTimeStampString(String date, final String format) { public static String getTimeStampString(final Date date, final String format){
try { java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat (format, java.util.Locale.KOREA);
if (null == date || "".equals(date)) return formatter.format(date);
return ""; }
Date d = null; public static String getTimeStampString(String date, final String format) {
date = date.replaceAll("-", ""); try {
if(null == date || "".equals(date)) return "";
switch (date.length()) { Date d = null;
case 14: date= date.replaceAll("-", "");
break;
case 12:
date += "00";
break;
case 10:
date += "0000";
break;
case 8:
date += "000000";
break;
case 6:
date += "01000000";
break;
case 4:
date += "0101000000";
break;
default:
return "";
}
java.text.SimpleDateFormat tmpFormat = new java.text.SimpleDateFormat("yyyyMMddHHmmss", switch(date.length()) {
java.util.Locale.KOREA); case 14: break;
case 12: date += "00"; break;
case 10: date += "0000"; break;
case 8: date += "000000"; break;
case 6: date += "01000000"; break;
case 4: date += "0101000000"; break;
default: return "";
}
if ("".equals(date)) java.text.SimpleDateFormat tmpFormat = new java.text.SimpleDateFormat("yyyyMMddHHmmss", java.util.Locale.KOREA);
d = new Date();
else {
tmpFormat.setLenient(true);
d = tmpFormat.parse(date);
}
return getTimeStampString(d, format); if("".equals(date)) d = new Date();
} catch (Exception e) { else {
e.printStackTrace(); tmpFormat.setLenient(true);
return ""; d = tmpFormat.parse(date);
} }
}
public static String getFileExtention(final String filename) { return getTimeStampString(d, format);
if (null == filename || "".equals(filename)) } catch(Exception e) {
return ""; e.printStackTrace();
return "";
}
}
return -1 < filename.lastIndexOf(".") ? filename.substring(filename.lastIndexOf(".") + 1).toLowerCase() : ""; public static String getFileExtention(final String filename) {
} if(null == filename || "".equals(filename)) return "";
public static String generationSaveName() { return -1 < filename.lastIndexOf(".") ? filename.substring(filename.lastIndexOf(".") + 1).toLowerCase() : "";
try { }
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return ExcelMergeHeaderUtil.getTimeStampString("yyyyMMdd_HHmmss_SSS");
}
public static void listToExcel(List<EgovMap> list, HttpServletResponse response, String[] headers, public static String generationSaveName() {
String[] headerNames, String[] columnType, String sheetName, String excelFileName) throws IOException { try {
if (ExcelMergeHeaderUtil.isNotEmpty(list)) { Thread.sleep(100);
// 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다. } catch (InterruptedException e) {
XSSFWorkbook wb = new XSSFWorkbook(); e.printStackTrace();
Sheet sheet = wb.createSheet(sheetName); }
Row headerRow = sheet.createRow(0); return ExcelMergeHeaderUtil.getTimeStampString("yyyyMMdd_HHmmss_SSS");
CellStyle cellStyle1 = wb.createCellStyle(); // 쉼표들어간 숫자 양식 }
CellStyle cellStyle2 = wb.createCellStyle(); // 숫자양식
CellStyle headerStyle = wb.createCellStyle(); // 헤더 스타일
CellStyle borderStyle = wb.createCellStyle(); // 기본 검정 테두리 스타일
// 기본 검정 테두리 스타일 설정 public static void listToExcel(List<EgovMap> list, HttpServletResponse response, String[] headers, String[] headerNames, String[] columnType, String sheetName, String excelFileName) throws IOException {
borderStyle.setBorderTop(BorderStyle.THIN); if(ExcelMergeHeaderUtil.isNotEmpty(list)) {
borderStyle.setBorderBottom(BorderStyle.THIN); // 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다.
borderStyle.setBorderLeft(BorderStyle.THIN); XSSFWorkbook wb = new XSSFWorkbook();
borderStyle.setBorderRight(BorderStyle.THIN); Sheet sheet = wb.createSheet(sheetName);
Row headerRow = sheet.createRow(0);
CellStyle cellStyle1 = wb.createCellStyle(); //쉼표들어간 숫자 양식
CellStyle cellStyle2 = wb.createCellStyle(); //숫자양식
CellStyle headerStyle = wb.createCellStyle(); //헤더 스타일
CellStyle borderStyle = wb.createCellStyle(); // 기본 검정 테두리 스타일
// 글꼴 색상 흰색으로 설정 // 기본 검정 테두리 스타일 설정
Font headerFont = wb.createFont(); borderStyle.setBorderTop(BorderStyle.THIN);
headerFont.setColor(IndexedColors.WHITE.getIndex()); // 글씨 색상 흰색 borderStyle.setBorderBottom(BorderStyle.THIN);
headerStyle.setFont(headerFont); // 헤더 스타일에 적용 borderStyle.setBorderLeft(BorderStyle.THIN);
borderStyle.setBorderRight(BorderStyle.THIN);
// 글꼴 색상 흰색으로 설정
Font headerFont = wb.createFont();
headerFont.setColor(IndexedColors.WHITE.getIndex()); // 글씨 색상 흰색
headerStyle.setFont(headerFont); // 헤더 스타일에 적용
XSSFDataFormat format = wb.createDataFormat(); XSSFDataFormat format = wb.createDataFormat();
cellStyle1.setDataFormat(format.getFormat("#,##0")); cellStyle1.setDataFormat(format.getFormat("#,##0"));
cellStyle2.setDataFormat(format.getFormat("#")); cellStyle2.setDataFormat(format.getFormat("#"));
headerStyle.setBorderTop(BorderStyle.THIN); headerStyle.setBorderTop(BorderStyle.THIN);
headerStyle.setBorderBottom(BorderStyle.THIN); headerStyle.setBorderBottom(BorderStyle.THIN);
headerStyle.setBorderLeft(BorderStyle.THIN); headerStyle.setBorderLeft(BorderStyle.THIN);
headerStyle.setBorderRight(BorderStyle.THIN); headerStyle.setBorderRight(BorderStyle.THIN);
headerStyle.setAlignment(HorizontalAlignment.CENTER); headerStyle.setAlignment(HorizontalAlignment.CENTER);
headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); headerStyle.setVerticalAlignment(VerticalAlignment.CENTER);
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
headerStyle.setFillForegroundColor((short) 3); headerStyle.setFillForegroundColor((short)3);
headerStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex()); headerStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());
for (int i = 0; i < list.size(); i++) { for(int i=0; i<list.size(); i++) {
EgovMap rowData = list.get(i); EgovMap rowData = list.get(i);
Row row = sheet.createRow(i + 1); Row row = sheet.createRow(i+1);
for (int j = 0; j < headers.length; j++) { for(int j=0; j<headers.length; j++) {
Cell cell = row.createCell(j); Cell cell = row.createCell(j);
Object value = rowData.get(headers[j]); Object value = rowData.get(headers[j]);
// Money 타입 // Money 타입
if ("Money".equalsIgnoreCase(columnType[j])) { if ("Money".equalsIgnoreCase(columnType[j])) {
if (value instanceof Number) { if (value instanceof Number) {
cell.setCellValue(((Number) value).doubleValue()); cell.setCellValue(((Number) value).doubleValue());
} else { } else {
cell.setCellValue(0); cell.setCellValue(0);
} }
cell.setCellStyle(cellStyle1); cell.setCellStyle(cellStyle1);
// Int 타입 // Int 타입
} else if ("Int".equalsIgnoreCase(columnType[j])) { } else if ("Int".equalsIgnoreCase(columnType[j])) {
if (value instanceof Number) { if (value instanceof Number) {
cell.setCellValue(((Number) value).doubleValue()); cell.setCellValue(((Number) value).doubleValue());
} else { } else {
cell.setCellValue(0); cell.setCellValue(0);
} }
cell.setCellStyle(cellStyle2); cell.setCellStyle(cellStyle2);
// String 타입 // String 타입
} else { } else {
cell.setCellValue(value == null ? "" : String.valueOf(value)); cell.setCellValue(value == null ? "" : String.valueOf(value));
} }
// 검정 테두리 적용 // 검정 테두리 적용
cell.setCellStyle(borderStyle); cell.setCellStyle(borderStyle);
} }
} }
for (int j = 0; j < headerNames.length; j++) { for(int j=0; j<headerNames.length; j++) {
Cell cell = headerRow.createCell(j); Cell cell = headerRow.createCell(j);
cell.setCellValue(headerNames[j]); cell.setCellValue(headerNames[j]);
cell.setCellStyle(headerStyle); cell.setCellStyle(headerStyle);
sheet.autoSizeColumn(j); sheet.autoSizeColumn(j);
sheet.setColumnWidth(j, (sheet.getColumnWidth(j)) + 1000); sheet.setColumnWidth(j, (sheet.getColumnWidth(j)) + 1000);
} }
// 엑셀이름 한글깨짐방지 //엑셀이름 한글깨짐방지
String outputFileName = new String(excelFileName.getBytes("KSC5601"), "8859_1"); String outputFileName = new String(excelFileName.getBytes("KSC5601"), "8859_1");
response.setHeader("Set-Cookie", "fileDownload=true; path=/"); response.setHeader("Set-Cookie", "fileDownload=true; path=/");
response.setHeader("Content-Disposition", String.format("attachment; filename=\"" + outputFileName + "_" response.setHeader("Content-Disposition", String.format("attachment; filename=\""+outputFileName+"_"+ExcelMergeHeaderUtil.getTimeStampString("yyyyMMdd_HHmm")+".xlsx\""));
+ ExcelMergeHeaderUtil.getTimeStampString("yyyyMMdd_HHmm") + ".xlsx\""));
wb.write(response.getOutputStream()); wb.write(response.getOutputStream());
wb.close(); wb.close();
} else { } else {
createNoDataAlert(response); createNoDataAlert(response);
} }
} }
public static void listToExcelMergeHeader(List<EgovMap> list, HttpServletResponse response, String[] headers, public static void listToExcelMergeHeader(List<EgovMap> list, HttpServletResponse response, String[] headers, String[][] headerNames, int[] headerWidths, String[] columnType, String sheetName, String excelFileName) throws IOException {
String[][] headerNames, int[] headerWidths, String[] columnType, String sheetName, String excelFileName) if(ExcelMergeHeaderUtil.isNotEmpty(list)) {
throws IOException { // 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다.
if (ExcelMergeHeaderUtil.isNotEmpty(list)) { XSSFWorkbook wb = new XSSFWorkbook();
// 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다. Sheet sheet = wb.createSheet(sheetName);
// XSSFWorkbook wb = new XSSFWorkbook(); Row headerRow = sheet.createRow(headerNames.length);
Workbook wb = new SXSSFWorkbook(200); CellStyle cellStyle1 = wb.createCellStyle(); //쉼표들어간 숫자 양식
Sheet sheet = wb.createSheet(sheetName); CellStyle cellStyle2 = wb.createCellStyle(); //숫자양식
Row headerRow = sheet.createRow(headerNames.length); CellStyle headerStyle = wb.createCellStyle(); //헤더 스타일
CellStyle cellStyle1 = wb.createCellStyle(); // 쉼표들어간 숫자 양식 CellStyle borderStyle = wb.createCellStyle(); // 기본 검정 테두리 스타일
CellStyle cellStyle2 = wb.createCellStyle(); // 숫자양식
CellStyle headerStyle = wb.createCellStyle(); // 헤더 스타일
CellStyle borderStyle = wb.createCellStyle(); // 기본 검정 테두리 스타일
// 기본 검정 테두리 스타일 설정 // 기본 검정 테두리 스타일 설정
borderStyle.setBorderTop(BorderStyle.THIN); borderStyle.setBorderTop(BorderStyle.THIN);
borderStyle.setBorderBottom(BorderStyle.THIN); borderStyle.setBorderBottom(BorderStyle.THIN);
borderStyle.setBorderLeft(BorderStyle.THIN); borderStyle.setBorderLeft(BorderStyle.THIN);
borderStyle.setBorderRight(BorderStyle.THIN); borderStyle.setBorderRight(BorderStyle.THIN);
// 글꼴 색상 흰색으로 설정
Font headerFont = wb.createFont();
headerFont.setColor(IndexedColors.WHITE.getIndex()); // 글씨 색상 흰색
headerStyle.setFont(headerFont); // 헤더 스타일에 적용
XSSFDataFormat format = wb.createDataFormat();
cellStyle1.setDataFormat(format.getFormat("#,##0"));
cellStyle2.setDataFormat(format.getFormat("#"));
headerStyle.setBorderTop(BorderStyle.THIN);
headerStyle.setBorderBottom(BorderStyle.THIN);
headerStyle.setBorderLeft(BorderStyle.THIN);
headerStyle.setBorderRight(BorderStyle.THIN);
headerStyle.setAlignment(HorizontalAlignment.CENTER);
headerStyle.setVerticalAlignment(VerticalAlignment.CENTER);
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// headerStyle.setFillForegroundColor((short)3);
headerStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());
// 글꼴 색상 흰색으로 설정 // 바디 스타일
Font headerFont = wb.createFont(); CellStyle bodyStyle = wb.createCellStyle();
headerFont.setColor(IndexedColors.WHITE.getIndex()); // 글씨 색상 흰색 bodyStyle.setAlignment(HorizontalAlignment.CENTER);
headerStyle.setFont(headerFont); // 헤더 스타일에 적용 // ---------- 헤더구성 ------------------------------------
Row hRow = null;
// rows
int rowCnt = 0;
// XSSFDataFormat format = wb.createDataFormat(); // 헤더 셀 병합
DataFormat format = wb.createDataFormat(); // === 세로 병합 (단일 컬럼) ===
cellStyle1.setDataFormat(format.getFormat("#,##0")); sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0)); // 연번
cellStyle2.setDataFormat(format.getFormat("#")); sheet.addMergedRegion(new CellRangeAddress(0, 1, 1, 1)); // 사업명
headerStyle.setBorderTop(BorderStyle.THIN); sheet.addMergedRegion(new CellRangeAddress(0, 1, 2, 2)); // 입력상태
headerStyle.setBorderBottom(BorderStyle.THIN);
headerStyle.setBorderLeft(BorderStyle.THIN); // === 가로 병합 (대분류) ===
headerStyle.setBorderRight(BorderStyle.THIN); sheet.addMergedRegion(new CellRangeAddress(0, 0, 3, 4)); // 사업내용
headerStyle.setAlignment(HorizontalAlignment.CENTER); sheet.addMergedRegion(new CellRangeAddress(0, 0, 5, 8)); // 발주기관현황
headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); sheet.addMergedRegion(new CellRangeAddress(0, 0, 9, 11)); // 건설사현황
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// headerStyle.setFillForegroundColor((short)3); // 헤더 정보 구성
headerStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex()); for (int i = 0; i < headerNames.length; i++) {
hRow = sheet.createRow(rowCnt++);
for (int j = 0; j < headerNames[i].length; j++) {
Cell cell = headerRow.createCell(j);
cell = hRow.createCell(j);
cell.setCellStyle(headerStyle);
cell.setCellValue(headerNames[i][j]);
sheet.setColumnWidth(j, (sheet.getColumnWidth(j)) + 1000);
sheet.setColumnWidth(j, headerWidths[j]);
}
}
// 바디 스타일 // ---------- 헤더구성 끝------------------------------------
CellStyle bodyStyle = wb.createCellStyle();
bodyStyle.setAlignment(HorizontalAlignment.CENTER);
// ---------- 헤더구성 ------------------------------------
Row hRow = null;
// rows
int rowCnt = 0;
// 헤더 셀 병합 for (int i = 0; i < list.size(); i++) {
// === 세로 병합 (단일 컬럼) === EgovMap rowData = list.get(i);
sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0)); // 연번 Row row = sheet.createRow(i + 2);
sheet.addMergedRegion(new CellRangeAddress(0, 1, 1, 1)); // 사업명
sheet.addMergedRegion(new CellRangeAddress(0, 1, 2, 2)); // 입력상태
// === 가로 병합 (대분류) === for (int j = 0; j < headers.length; j++) {
sheet.addMergedRegion(new CellRangeAddress(0, 0, 3, 4)); // 사업내용 Cell cell = row.createCell(j);
sheet.addMergedRegion(new CellRangeAddress(0, 0, 5, 8)); // 발주기관현황
sheet.addMergedRegion(new CellRangeAddress(0, 0, 9, 11)); // 건설사현황
// 헤더 정보 구성 // 특정 컬럼 중앙 정렬 -----참고용------------
for (int i = 0; i < headerNames.length; i++) { // if ("lvl1_rate".equals(headers[j]) ||
hRow = sheet.createRow(rowCnt++); // "lvl2_rate".equals(headers[j]) ||
for (int j = 0; j < headerNames[i].length; j++) { // "lvl3_rate".equals(headers[j]) ||
Cell cell = headerRow.createCell(j); // "lvl2_organ_up".equals(headers[j]) ||
cell = hRow.createCell(j); // "lvl3_organ_up".equals(headers[j])) {
cell.setCellStyle(headerStyle); // cell.setCellStyle(bodyStyle);
cell.setCellValue(headerNames[i][j]); // } -----참고용------------
sheet.setColumnWidth(j, (sheet.getColumnWidth(j)) + 1000);
sheet.setColumnWidth(j, headerWidths[j]);
}
}
// ---------- 헤더구성 끝------------------------------------ Object value = rowData.get(headers[j]);
for (int i = 0; i < list.size(); i++) { // Money 타입
EgovMap rowData = list.get(i); if ("Money".equalsIgnoreCase(columnType[j])) {
Row row = sheet.createRow(i + 2); if (value instanceof Number) {
cell.setCellValue(((Number) value).doubleValue());
} else {
cell.setCellValue(0);
}
cell.setCellStyle(cellStyle1);
for (int j = 0; j < headers.length; j++) { // Int 타입
Cell cell = row.createCell(j); } else if ("Int".equalsIgnoreCase(columnType[j])) {
if (value instanceof Number) {
cell.setCellValue(((Number) value).doubleValue());
} else {
cell.setCellValue(0);
}
cell.setCellStyle(cellStyle2);
// 특정 컬럼 중앙 정렬 -----참고용------------ // String 타입
// if ("lvl1_rate".equals(headers[j]) || } else {
// "lvl2_rate".equals(headers[j]) || cell.setCellValue(value == null ? "" : String.valueOf(value));
// "lvl3_rate".equals(headers[j]) || }
// "lvl2_organ_up".equals(headers[j]) || // 검정 테두리 적용
// "lvl3_organ_up".equals(headers[j])) { cell.setCellStyle(borderStyle);
// cell.setCellStyle(bodyStyle); }
// } -----참고용------------ }
Object value = rowData.get(headers[j]); //엑셀이름 한글깨짐방지
String outputFileName = new String(excelFileName.getBytes("KSC5601"), "8859_1");
// Money 타입 response.setHeader("Set-Cookie", "fileDownload=true; path=/");
if ("Money".equalsIgnoreCase(columnType[j])) { response.setHeader("Content-Disposition", String.format("attachment; filename=\""+outputFileName+"_"+ExcelMergeHeaderUtil.getTimeStampString("yyyyMMdd_HHmm")+".xlsx\""));
if (value instanceof Number) {
cell.setCellValue(((Number) value).doubleValue());
} else {
cell.setCellValue(0);
}
cell.setCellStyle(cellStyle1);
// Int 타입 wb.write(response.getOutputStream());
} else if ("Int".equalsIgnoreCase(columnType[j])) { wb.close();
if (value instanceof Number) { } else {
cell.setCellValue(((Number) value).doubleValue()); createNoDataAlert(response);
} else { }
cell.setCellValue(0);
}
cell.setCellStyle(cellStyle2);
// String 타입 }
} else {
cell.setCellValue(value == null ? "" : String.valueOf(value));
}
// 검정 테두리 적용
cell.setCellStyle(borderStyle);
}
}
// 엑셀이름 한글깨짐방지 private static void createNoDataAlert(HttpServletResponse response) throws IOException {
String encodedFileName = URLEncoder.encode(excelFileName, "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-Type", "text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName + "_" out.write("<html lang=\"ko\">");
+ ExcelMergeHeaderUtil.getTimeStampString("yyyyMMdd_HHmm") + ".xlsx"); out.write("<head>");
out.write("<script type=\"text/javascript\">");
out.write("alert('데이터가 없습니다.');");
out.write("history.back(-1);");
out.write("</script>");
out.write("</head>");
out.write("</html>");
// ========================= out.flush();
// 엑셀을 ByteArray로 생성 out.close();
// ========================= }
ByteArrayOutputStream bos = new ByteArrayOutputStream();
wb.write(bos);
if (wb instanceof SXSSFWorkbook) { public static void setDisposition(String filename, HttpServletRequest request, HttpServletResponse response) throws IOException {
((SXSSFWorkbook) wb).dispose(); // temp 파일 정리 String browser = getBrowser(request);
}
wb.close();
byte[] fileBytes = bos.toByteArray(); String dispositionPrefix = "attachment; filename=";
response.setContentLength(fileBytes.length); String encodedFilename = null;
// ========================= if (browser.equals("MSIE")) {
// 전송 encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20");
// ========================= } else if (browser.equals("Trident")) { // IE11 문자열 깨짐 방지
OutputStream os = response.getOutputStream(); encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20");
os.write(fileBytes); } else if (browser.equals("Firefox")) {
os.flush(); encodedFilename = "\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
os.close(); } else if (browser.equals("Opera")) {
encodedFilename = "\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
} else if (browser.equals("Chrome")) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < filename.length(); i++) {
char c = filename.charAt(i);
if(c==','){
sb.append(URLEncoder.encode("", "UTF-8"));
} else if (c > '~') {
sb.append(URLEncoder.encode("" + c, "UTF-8"));
} else {
sb.append(c);
}
}
encodedFilename = sb.toString();
} else {
throw new IOException("Not supported browser");
}
response.setHeader("Content-Disposition", dispositionPrefix + encodedFilename);
if ("Opera".equals(browser)) {
response.setContentType("application/octet-stream;charset=UTF-8");
}
if(filename.contains("zip")){
response.setContentType("application/zip");
}
}
private static String getBrowser(HttpServletRequest request) {
String header = request.getHeader("User-Agent");
if (header.indexOf("MSIE") > -1) {
return "MSIE";
} else if (header.indexOf("Trident") > -1) { // IE11 문자열 깨짐 방지
return "Trident";
} else if (header.indexOf("Chrome") > -1) {
return "Chrome";
} else if (header.indexOf("Opera") > -1) {
return "Opera";
}
return "Firefox";
}
public static String LocalDateTimeToStringDate(LocalDateTime localDateTime) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formattedDate = localDateTime.toLocalDate().format(formatter);
return formattedDate;
}
public static void listToExcelMergeHeaderForLoginHistory(List<EgovMap> list, HttpServletResponse response, String[] headers, String[] headerNames, int[] headerWidths, String[] columnType, String sheetName, String excelFileName) throws IOException {
if(ExcelMergeHeaderUtil.isNotEmpty(list)) {
// 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다.
XSSFWorkbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet(sheetName);
Row headerRow = sheet.createRow(headerNames.length);
CellStyle cellStyle1 = wb.createCellStyle(); //쉼표들어간 숫자 양식
CellStyle cellStyle2 = wb.createCellStyle(); //숫자양식
CellStyle headerStyle = wb.createCellStyle(); //헤더 스타일
CellStyle borderStyle = wb.createCellStyle(); // 기본 검정 테두리 스타일
// 기본 검정 테두리 스타일 설정
borderStyle.setBorderTop(BorderStyle.THIN);
borderStyle.setBorderBottom(BorderStyle.THIN);
borderStyle.setBorderLeft(BorderStyle.THIN);
borderStyle.setBorderRight(BorderStyle.THIN);
// 글꼴 색상 흰색으로 설정
Font headerFont = wb.createFont();
headerFont.setColor(IndexedColors.WHITE.getIndex()); // 글씨 색상 흰색
headerStyle.setFont(headerFont); // 헤더 스타일에 적용
XSSFDataFormat format = wb.createDataFormat();
cellStyle1.setDataFormat(format.getFormat("#,##0"));
cellStyle2.setDataFormat(format.getFormat("#"));
headerStyle.setBorderTop(BorderStyle.THIN);
headerStyle.setBorderBottom(BorderStyle.THIN);
headerStyle.setBorderLeft(BorderStyle.THIN);
headerStyle.setBorderRight(BorderStyle.THIN);
headerStyle.setAlignment(HorizontalAlignment.CENTER);
headerStyle.setVerticalAlignment(VerticalAlignment.CENTER);
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// headerStyle.setFillForegroundColor((short)3);
headerStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());
// 바디 스타일
CellStyle bodyStyle = wb.createCellStyle();
bodyStyle.setAlignment(HorizontalAlignment.CENTER);
// ---------- 헤더구성 ------------------------------------
Row hRow = null;
// rows
int rowCnt = 0;
wb.close(); // 헤더 정보 구성
} else { hRow = sheet.createRow(rowCnt++);
createNoDataAlert(response); for (int i = 0; i < headerNames.length; i++) {
} Cell cell = headerRow.createCell(i);
cell = hRow.createCell(i);
cell.setCellStyle(headerStyle);
cell.setCellValue(headerNames[i]);
sheet.setColumnWidth(i, (sheet.getColumnWidth(i)) + 1000);
sheet.setColumnWidth(i, headerWidths[i]);
}
} // ---------- 헤더구성 끝------------------------------------
private static void createNoDataAlert(HttpServletResponse response) throws IOException { for (int i = 0; i < list.size(); i++) {
response.setHeader("Content-Type", "text/html; charset=UTF-8"); EgovMap rowData = list.get(i);
PrintWriter out = response.getWriter(); Row row = sheet.createRow(i + 1);
out.write( for (int j = 0; j < headers.length; j++) {
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">"); Cell cell = row.createCell(j);
out.write("<html lang=\"ko\">");
out.write("<head>");
out.write("<script type=\"text/javascript\">");
out.write("alert('데이터가 없습니다.');");
out.write("history.back(-1);");
out.write("</script>");
out.write("</head>");
out.write("</html>");
out.flush(); Object value = rowData.get(headers[j]);
out.close();
}
public static void setDisposition(String filename, HttpServletRequest request, HttpServletResponse response) // Money 타입
throws IOException { if ("Money".equalsIgnoreCase(columnType[j])) {
String browser = getBrowser(request); if (value instanceof Number) {
cell.setCellValue(((Number) value).doubleValue());
} else {
cell.setCellValue(0);
}
cell.setCellStyle(cellStyle1);
String dispositionPrefix = "attachment; filename="; // Int 타입
String encodedFilename = null; } else if ("Int".equalsIgnoreCase(columnType[j])) {
if (value instanceof Number) {
cell.setCellValue(((Number) value).doubleValue());
} else {
cell.setCellValue(0);
}
cell.setCellStyle(cellStyle2);
if (browser.equals("MSIE")) { // String 타입
encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20"); } else {
} else if (browser.equals("Trident")) { // IE11 문자열 깨짐 방지 cell.setCellValue(value == null ? "" : String.valueOf(value));
encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20"); }
} else if (browser.equals("Firefox")) { // 검정 테두리 적용
encodedFilename = "\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\""; cell.setCellStyle(borderStyle);
} else if (browser.equals("Opera")) { }
encodedFilename = "\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\""; }
} else if (browser.equals("Chrome")) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < filename.length(); i++) {
char c = filename.charAt(i);
if (c == ',') {
sb.append(URLEncoder.encode("", "UTF-8"));
} else if (c > '~') {
sb.append(URLEncoder.encode("" + c, "UTF-8"));
} else {
sb.append(c);
}
}
encodedFilename = sb.toString();
} else {
throw new IOException("Not supported browser");
}
response.setHeader("Content-Disposition", dispositionPrefix + encodedFilename); //엑셀이름 한글깨짐방지
String outputFileName = new String(excelFileName.getBytes("KSC5601"), "8859_1");
if ("Opera".equals(browser)) { response.setHeader("Set-Cookie", "fileDownload=true; path=/");
response.setContentType("application/octet-stream;charset=UTF-8"); response.setHeader("Content-Disposition", String.format("attachment; filename=\""+outputFileName+"_"+ExcelMergeHeaderUtil.getTimeStampString("yyyyMMdd_HHmm")+".xlsx\""));
}
if (filename.contains("zip")) {
response.setContentType("application/zip");
}
}
private static String getBrowser(HttpServletRequest request) { wb.write(response.getOutputStream());
String header = request.getHeader("User-Agent"); wb.close();
if (header.indexOf("MSIE") > -1) { } else {
return "MSIE"; createNoDataAlert(response);
} else if (header.indexOf("Trident") > -1) { // IE11 문자열 깨짐 방지 }
return "Trident";
} else if (header.indexOf("Chrome") > -1) {
return "Chrome";
} else if (header.indexOf("Opera") > -1) {
return "Opera";
}
return "Firefox";
}
public static String LocalDateTimeToStringDate(LocalDateTime localDateTime) { }
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formattedDate = localDateTime.toLocalDate().format(formatter);
return formattedDate;
}
public static void listToExcelMergeHeaderForLoginHistory(List<EgovMap> list, HttpServletResponse response,
String[] headers, String[] headerNames, int[] headerWidths, String[] columnType, String sheetName,
String excelFileName) throws IOException {
if (ExcelMergeHeaderUtil.isNotEmpty(list)) {
// 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다.
XSSFWorkbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet(sheetName);
Row headerRow = sheet.createRow(headerNames.length);
CellStyle cellStyle1 = wb.createCellStyle(); // 쉼표들어간 숫자 양식
CellStyle cellStyle2 = wb.createCellStyle(); // 숫자양식
CellStyle headerStyle = wb.createCellStyle(); // 헤더 스타일
CellStyle borderStyle = wb.createCellStyle(); // 기본 검정 테두리 스타일
// 기본 검정 테두리 스타일 설정
borderStyle.setBorderTop(BorderStyle.THIN);
borderStyle.setBorderBottom(BorderStyle.THIN);
borderStyle.setBorderLeft(BorderStyle.THIN);
borderStyle.setBorderRight(BorderStyle.THIN);
// 글꼴 색상 흰색으로 설정
Font headerFont = wb.createFont();
headerFont.setColor(IndexedColors.WHITE.getIndex()); // 글씨 색상 흰색
headerStyle.setFont(headerFont); // 헤더 스타일에 적용
XSSFDataFormat format = wb.createDataFormat();
cellStyle1.setDataFormat(format.getFormat("#,##0"));
cellStyle2.setDataFormat(format.getFormat("#"));
headerStyle.setBorderTop(BorderStyle.THIN);
headerStyle.setBorderBottom(BorderStyle.THIN);
headerStyle.setBorderLeft(BorderStyle.THIN);
headerStyle.setBorderRight(BorderStyle.THIN);
headerStyle.setAlignment(HorizontalAlignment.CENTER);
headerStyle.setVerticalAlignment(VerticalAlignment.CENTER);
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// headerStyle.setFillForegroundColor((short)3);
headerStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());
// 바디 스타일
CellStyle bodyStyle = wb.createCellStyle();
bodyStyle.setAlignment(HorizontalAlignment.CENTER);
// ---------- 헤더구성 ------------------------------------
Row hRow = null;
// rows
int rowCnt = 0;
// 헤더 정보 구성
hRow = sheet.createRow(rowCnt++);
for (int i = 0; i < headerNames.length; i++) {
Cell cell = headerRow.createCell(i);
cell = hRow.createCell(i);
cell.setCellStyle(headerStyle);
cell.setCellValue(headerNames[i]);
sheet.setColumnWidth(i, (sheet.getColumnWidth(i)) + 1000);
sheet.setColumnWidth(i, headerWidths[i]);
}
// ---------- 헤더구성 끝------------------------------------
for (int i = 0; i < list.size(); i++) {
EgovMap rowData = list.get(i);
Row row = sheet.createRow(i + 1);
for (int j = 0; j < headers.length; j++) {
Cell cell = row.createCell(j);
Object value = rowData.get(headers[j]);
// Money 타입
if ("Money".equalsIgnoreCase(columnType[j])) {
if (value instanceof Number) {
cell.setCellValue(((Number) value).doubleValue());
} else {
cell.setCellValue(0);
}
cell.setCellStyle(cellStyle1);
// Int 타입
} else if ("Int".equalsIgnoreCase(columnType[j])) {
if (value instanceof Number) {
cell.setCellValue(((Number) value).doubleValue());
} else {
cell.setCellValue(0);
}
cell.setCellStyle(cellStyle2);
// String 타입
} else {
cell.setCellValue(value == null ? "" : String.valueOf(value));
}
// 검정 테두리 적용
cell.setCellStyle(borderStyle);
}
}
// 엑셀이름 한글깨짐방지
String outputFileName = new String(excelFileName.getBytes("KSC5601"), "8859_1");
response.setHeader("Set-Cookie", "fileDownload=true; path=/");
response.setHeader("Content-Disposition", String.format("attachment; filename=\"" + outputFileName + "_"
+ ExcelMergeHeaderUtil.getTimeStampString("yyyyMMdd_HHmm") + ".xlsx\""));
wb.write(response.getOutputStream());
wb.close();
} else {
createNoDataAlert(response);
}
}
} }

View File

@ -574,7 +574,6 @@
// 엑셀 다운로드 // 엑셀 다운로드
function clickExcelDownload(){ function clickExcelDownload(){
/*
const params = new URLSearchParams(); const params = new URLSearchParams();
params.append("constTag", trim($('#const-tag').val())); params.append("constTag", trim($('#const-tag').val()));
@ -596,203 +595,7 @@
// AJAX가 아닌 직접 다운로드 요청 // AJAX가 아닌 직접 다운로드 요청
window.location.href = "/admins/drilling/inquiry/excel.do?" + params.toString(); window.location.href = "/admins/drilling/inquiry/excel.do?" + params.toString();
$('#excelDownload').val(""); $('#excelDownload').val("");
*/
const params = new URLSearchParams();
params.append("constTag", trim($('#const-tag').val()));
params.append("constName", trim($('#const-name').val()));
params.append("excelDownload", "Y");
parent[1].showLoadingBar();
fetch("/admins/drilling/inquiry/excel.do", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: params.toString()
})
.then(response => {
if (!response.ok) throw new Error("다운로드 실패");
const disposition = response.headers.get("Content-Disposition");
let fileName = "excel.xlsx";
if (disposition && disposition.includes("filename=")) {
fileName = disposition.split("filename=")[1].replace(/"/g, "");
}
return response.blob().then(blob => ({ blob, fileName }));
})
.then(({ blob, fileName }) => {
const url = window.URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = fileName;
document.body.appendChild(a);
a.click();
a.remove();
window.URL.revokeObjectURL(url);
})
.catch(err => {
alert("엑셀 다운로드 중 오류 발생");
console.error(err);
})
.finally(() => {
$('#excelDownload').val("");
parent.hideLoadingBar();
});
} }
let currentJobId = null;
function startExcelDownload() {
const params = new URLSearchParams();
params.append("constTag", trim($('#const-tag').val()));
params.append("constName", trim($('#const-name').val()));
params.append("excelDownload", "Y");
parent.showLoadingBar();
// parent.document.getElementById("progressWrap").style.display = "block";
fetch("/admins/drilling/inquiry/excel/start.do", {
method: "POST",
headers: {"Content-Type":"application/x-www-form-urlencoded"},
body: params.toString()
})
.then(res => res.json())
.then(data => {
currentJobId = data.jobId;
pollProgress();
});
$('#excelDownload').val("");
}
function pollProgress() {
fetch("/admins/drilling/inquiry/excel/progress.do?jobId=" + currentJobId)
.then(res => res.json())
.then(data => {
let percent = data.progress;
if(percent < 0){
alert("엑셀 생성 중 오류 발생");
return;
}
parent.document.getElementById("progressBar").style.width = percent + "%";
parent.document.getElementById("progressText").innerText = percent + "%";
if(percent < 100){
setTimeout(pollProgress, 500);
} else {
setTimeout(function(){
window.location = "/admins/drilling/inquiry/excel/download.do?jobId=" + currentJobId;
parent.hideLoadingBar();
}, 700);
}
});
}
$(document).ready(function() {
$(document).on("click", '#btnSubmit', function(e) {
var canvasModal = parent.document.getElementById("canvasModal");
var canvas = parent.document.getElementById("canvas");
var ctx = canvas.getContext("2d");
function showPer(per) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 원형 진행률
ctx.strokeStyle = "#f66";
ctx.lineWidth = 10;
ctx.beginPath();
ctx.arc(canvas.width/2, canvas.height/2, 50, -Math.PI/2, (-Math.PI/2 + 2*Math.PI*per/100));
ctx.stroke();
// 숫자 표시
ctx.font = '20px Arial';
ctx.fillStyle = "#fff";
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText(per + '%', canvas.width/2, canvas.height/2);
}
const params = new URLSearchParams();
params.append("constTag", trim($('#const-tag').val()));
params.append("constName", trim($('#const-name').val()));
params.append("excelDownload", "Y");
var xhr = new XMLHttpRequest();
xhr.open("GET", "/admins/drilling/inquiry/excel.do?" + params.toString(), true);
xhr.responseType = "blob";
var fakePer = 0;
var fakeInterval;
xhr.onloadstart = function () {
canvasModal.style.display = "flex"; // 모달 표시
fakePer = 0;
showPer(4);
// fake progress 시작 (0~90%)
fakeInterval = setInterval(function() {
if (fakePer < 90) {
fakePer += Math.random() * 3; // 0~3%씩 증가
showPer(Math.floor(fakePer));
}
}, 100); // 0.1초마다 증가
};
xhr.onprogress = function (e) {
if (e.lengthComputable) {
showPer(Math.floor((e.loaded / e.total) * 100));
}
};
xhr.onload = function () {
if (xhr.status === 200) {
var blob = xhr.response;
// 서버에서 보낸 Content-Disposition 헤더 확인
var disposition = xhr.getResponseHeader('Content-Disposition');
var fileName = "excel.xlsx"; // 기본 파일명
if (disposition && disposition.indexOf('filename*=') !== -1) {
var matches = disposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);
if (matches != null && matches[1]) {
fileName = decodeURIComponent(matches[1]);
// 접두사 UTF-8'' 제거
fileName = fileName.replace(/^UTF-8''/, '');
}
}
// Blob 다운로드
var link = document.createElement("a");
link.href = window.URL.createObjectURL(blob);
link.download = fileName; // 서버에서 가져온 이름 사용
document.body.appendChild(link); // Firefox에서 필요
link.click();
document.body.removeChild(link);
}
};
xhr.onloadend = function () {
clearInterval(fakeInterval); // fake progress 중지
showPer(100);
setTimeout(function () {
canvasModal.style.display = "none"; // 모달 숨김
}, 500);
};
xhr.send();
});
});
</script><style> </script><style>
.drilling .page-content-inner { .drilling .page-content-inner {
padding: 30px 0; padding: 30px 0;
@ -977,7 +780,7 @@ li {
</div> </div>
<div class="table-info-group"> <div class="table-info-group">
<span>Total: <span id="count">-</span>건</span> <span>Total: <span id="count">-</span>건</span>
<span class="pull-right" id="btnSubmit"><img src="${pageContext.request.contextPath}/images/admins/excel.gif" style="cursor:hand"</span> <span class="pull-right"><img src="${pageContext.request.contextPath}/images/admins/excel.gif" style="cursor:hand" onClick="javascript:clickExcelDownload()"></span>
</div> </div>
<div class="table-wrap"> <div class="table-wrap">
<table> <table>
@ -1032,6 +835,7 @@ li {
</div> </div>
</section> </section>
<!-- 페이지 컨테이너 끝 --> <!-- 페이지 컨테이너 끝 -->
</form> </form>
</body> </body>
</html> </html>

View File

@ -7,92 +7,7 @@
<script> <script>
var waitWin; var waitWin;
function showLoadingBar() {
document.getElementById("loadingModal").style.display = "flex";
document.getElementById("progressBar").style.width = "0%";
document.getElementById("progressText").innerText = "0%";
}
function hideLoadingBar() {
document.getElementById("loadingModal").style.display = "none";
}
</script> </script>
<style type="text/css">
/* 전체 화면 반투명 배경 */
#loadingModal {
display: none; /* 기본 숨김 */
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
/* background: rgba(0,0,0,0.5); /* 반투명 검정 */ */
z-index: 9999;
/* display: flex; */
align-items: center;
justify-content: center;
}
/* 내용 박스 */
#loadingContent {
background: #fff;
padding: 30px 50px;
border-radius: 10px;
text-align: center;
min-width: 300px;
box-shadow: 0 0 20px rgba(0,0,0,0.3);
}
/* 로딩 스피너 */
.spinner {
border: 6px solid #f3f3f3;
border-top: 6px solid #3498db;
border-radius: 50%;
width: 40px;
height: 40px;
animation: spin 1s linear infinite;
margin: 0 auto 15px;
}
@keyframes spin {
0% { transform: rotate(0deg);}
100% { transform: rotate(360deg);}
}
/* 진행률 바 */
#progressWrap {
width: 100%;
height: 20px;
background: #eee;
border-radius: 10px;
margin: 10px 0;
}
#progressBar {
width: 0%;
height: 100%;
background: #4caf50;
border-radius: 10px;
}
#progressText {
margin-top: 5px;
font-weight: bold;
}
#canvasModal {
display:none;
position:fixed;
top:0;
left:0;
width:100%;
height:100%;
background: rgba(0,0,0,0.5);
z-index:9999;
align-items:center;
justify-content:center;
}
</style>
</head> </head>
<body leftmargin="0" topmargin="0" marginheight="0" marginwidth="0"> <body leftmargin="0" topmargin="0" marginheight="0" marginwidth="0">
<!-- <!--
@ -103,20 +18,5 @@ function hideLoadingBar() {
<iframe src="${pageContext.request.contextPath}/admins/${menuId}/${pId}.do?isFirst=true" frameborder="0" height="740" width="100%" scrolling="yes" name="iframeMain" style="overflow-x: hidden;"></iframe> <iframe src="${pageContext.request.contextPath}/admins/${menuId}/${pId}.do?isFirst=true" frameborder="0" height="740" width="100%" scrolling="yes" name="iframeMain" style="overflow-x: hidden;"></iframe>
<!-- 로딩 모달 -->
<div id="loadingModal">
<div id="loadingContent">
<div class="spinner"></div>
<div id="loadingText">엑셀 파일 생성 중...</div>
<div id="progressWrap">
<div id="progressBar"></div>
</div>
<div id="progressText">0%</div>
</div>
</div>
<!-- Canvas Modal -->
<div id="canvasModal">
<canvas id="canvas" width="120" height="120" style="background:none;"></canvas>
</div>
</body> </body>
</html> </html>