자바 POI 이름 관리자 다단 계 연동
public static void main(String[] args) {
String newFilePath="/Users/yangguangcai/Downloads/test1666.xls";
String sheetTitle="ceshi";
List<String> headers = Arrays.asList(" ", " ", " ");
Map<String, String[]> gradeMap = new HashMap<>();
gradeMap.put(" ",new String[]{"yi"," "});
gradeMap.put(" ",new String[]{"er"," "});
String[] gradeInfo=new String[]{" "," "};
Cascade(newFilePath,sheetTitle,headers,gradeMap,gradeInfo);
}
public static void Cascade(String filePath, String sheetTitle, List<String> headers, Map<String,String[]> map, String[] fatherOption) {
// excel
@SuppressWarnings("resource")
Workbook book = new XSSFWorkbook();
// sheet
XSSFSheet sheetPro = (XSSFSheet) book.createSheet(sheetTitle);
Row row0 = sheetPro.createRow(0);
for (int i = 0;i<headers.size();i++){
row0.createCell(i).setCellValue(headers.get(i));
}
// sheet
// , 。
Sheet hideSheet = book.createSheet("hideSheet");
// sheet , , sheet
book.setSheetHidden(book.getSheetIndex(hideSheet), true);
int rowId = 0;
// ,
Row oneRow = hideSheet.createRow(rowId++);
oneRow.createCell(0).setCellValue(sheetTitle);
for(int i = 0; i < fatherOption.length; i ++){
Cell provinceCell = oneRow.createCell(i + 1);
provinceCell.setCellValue(fatherOption[i]);
}
// , , 。
for(int i = 0;i < fatherOption.length;i++){
String key = fatherOption[i];
String[] son = map.get(key);
Row row = hideSheet.createRow(rowId++);
row.createCell(0).setCellValue(key);
for(int j = 0; j < son.length; j ++){
Cell cell = row.createCell(j + 1);
cell.setCellValue(son[j]);
}
//
String range = getRange(1, rowId, son.length);
Name name = book.createName();
//key
name.setNameName(key);
String formula = "hideSheet!" + range;
name.setRefersToFormula(formula);
}
XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet)sheetPro);
//
DataValidationConstraint provConstraint = dvHelper.createExplicitListConstraint(fatherOption);
// : 、 、 、
CellRangeAddressList provRangeAddressList = new CellRangeAddressList(1, 20, 6, 6);
DataValidation provinceDataValidation = dvHelper.createValidation(provConstraint, provRangeAddressList);
//
provinceDataValidation.createErrorBox("error", " ");
provinceDataValidation.setShowErrorBox(true);
provinceDataValidation.setSuppressDropDownArrow(true);
sheetPro.addValidationData(provinceDataValidation);
// 20
for(int i = 2;i < 20;i++){
setDataValidation("G" ,sheetPro,i,8);
}
FileOutputStream os = null;
try {
os = new FileOutputStream(filePath);
book.write(os);
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(os);
}
}
/**
*
* @param offset ,
* @param sheet
* @param rowNum
* @param colNum
*/
public static void setDataValidation(String offset,XSSFSheet sheet, int rowNum,int colNum) {
XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);
DataValidation data_validation_list;
data_validation_list = getDataValidationByFormula(
"INDIRECT($" + offset + (rowNum) + ")", rowNum, colNum,dvHelper);
sheet.addValidationData(data_validation_list);
}
/**
*
* @param formulaString
* @param naturalRowIndex
* @param naturalColumnIndex
* @param dvHelper
* @return
*/
private static DataValidation getDataValidationByFormula(
String formulaString, int naturalRowIndex, int naturalColumnIndex,XSSFDataValidationHelper dvHelper) {
//
// : formulaString = "INDIRECT($A$2)" key A2 ,
// A2 , 。
XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createFormulaListConstraint(formulaString);
// 。
// : 、 、 、
int firstRow = naturalRowIndex -1;
int lastRow = naturalRowIndex - 1;
int firstCol = naturalColumnIndex - 1;
int lastCol = naturalColumnIndex - 1;
CellRangeAddressList regions = new CellRangeAddressList(firstRow,
lastRow, firstCol, lastCol);
//
//
XSSFDataValidation data_validation_list = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, regions);
data_validation_list.setEmptyCellAllowed(false);
if (data_validation_list instanceof XSSFDataValidation) {
data_validation_list.setSuppressDropDownArrow(true);
data_validation_list.setShowErrorBox(true);
} else {
data_validation_list.setSuppressDropDownArrow(false);
}
//
data_validation_list.createPromptBox(" ", " !");
//
return data_validation_list;
}
/**
* formula
* @param offset , 0, A ,1, B
* @param rowId
* @param colCount
* @return 1,1,10. B1-K1。 $B$1:$K$1
*
*/
public static String getRange(int offset, int rowId, int colCount) {
char start = (char)('A' + offset);
if (colCount <= 25) {
char end = (char)(start + colCount - 1);
return "$" + start + "$" + rowId + ":$" + end + "$" + rowId;
} else {
char endPrefix = 'A';
char endSuffix = 'A';
if ((colCount - 25) / 26 == 0 || colCount == 51) {// 26-51 , ( )
if ((colCount - 25) % 26 == 0) {//
endSuffix = (char)('A' + 25);
} else {
endSuffix = (char)('A' + (colCount - 25) % 26 - 1);
}
} else {// 51
if ((colCount - 25) % 26 == 0) {
endSuffix = (char)('A' + 25);
endPrefix = (char)(endPrefix + (colCount - 25) / 26 - 1);
} else {
endSuffix = (char)('A' + (colCount - 25) % 26 - 1);
endPrefix = (char)(endPrefix + (colCount - 25) / 26);
}
}
return "$" + start + "$" + rowId + ":$" + endPrefix + endSuffix + "$" + rowId;
}
}
분석: Excel 이름 관리자 의 다단 계 연동 은 실제 적 으로 하나의 sheet 를 만 드 는 것 입 니 다. 내용 을 이 숨겨 진 sheet 에 먼저 넣 은 다음 에 연동 적 으로 값 을 추출 하 는 것 입 니 다. 제안: 먼저 Excel 을 통 해 다단 계 연동 을 만 들 고 그 원 리 를 이해 한 후에 코드 를 이해 하 는 것 이 더욱 편리 합 니 다.
만 나 는 구덩이: 1. 명칭 관리 자 는 특수 문 자 를 식별 할 수 없다. 예 를 들 어 '- ()' 와 중국어 괄호 2. 처음에 Excel 을 통 해 명칭 관리 자 를 만 들 지 않 았 는데 올 라 오 자마자 코드 를 보고 눈 이 멀 어서 원리 의 중요성 을 알 았 다. 3. 이 물건 을 처음 접 했 기 때문에 정리 가 느 리 고 평소에 많이 접촉해 야 한다.많이 알다
참고: POI 내 보 내기 Excel 드 롭 다운 목록 다단 계 연동 (성 시 현 3 급 연동 의 경우) Java POI 는 드 롭 다운 상자 & 드 롭 다운 상자 가 있 는 Excel poi 를 생 성 합 니 다. '이름 관리자' 를 이용 하여 엑셀 드 롭 다운 상 자 를 구축 할 때 모두 2 급 이 고 1 급 목록 은 데이터 형식 이 숫자 인 데 이 터 를 포함 합 니 다. Excel 다단 계 드 롭 다운 메뉴 연동 자동 일치 내용 을 어떻게 처리 해 야 합 니까?
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.