C\#NPOI 기반 엑셀 조작
개발 중 에 우 리 는 셀 에 드 롭 다운 상 자 를 설정 하 는 것 을 만 날 수 있 습 니 다.일반적으로 다음 과 같이 작성 할 수 있 습 니 다:
var cellRanges = new CellRangeAddressList(firstRow, lastRow, firstCol, latsCol);
DVConstraint constraint = DVConstraint.CreateExplicitListConstraint(stringArray);
HSSFDataValidation validate = new HSSFDataValidation(cellRanges, constraint);
validate.ShowProptBox = true;
sheet.AddValidationData(validate);
단,NPOI 에서 Excel 을 내 보 낼 때 드 롭 다운 목록 값 이 255 이상 인 경우 문자열 배열 에 길이 제한 이 있 을 경우(String literals in formulas can't be bigger than 255 characters ASCII)해결 방안
새로 만 든 Excel Sheet 페이지 를 통 해 드 롭 다운 내용 을 저장 하고 드 롭 다운 상자 데이터 로 변환 합 니 다.
ISheet hidden = workbook.CreateSheet(columnName);
IRow row = null;
ICell cell = null;
for (int i = 0; i < stringArray.Length; i++)
{
row = hidden.CreateRow(i);
cell = row.CreateCell(0);
cell.SetCellValue(stringArray[i]);
}
IName namedCell = workbook.CreateName();
namedCell.NameName = column.ColumnName;
// Excel , `$`, 。
namedCell.RefersToFormula = $"{columnName}!$A$1:$A${stringArray.Length}";
DVConstraint constraint = DVConstraint.CreateFormulaListConstraint(columnName);
CellRangeAddressList addressList = new CellRangeAddressList(firstRow, lastRow, firstCol, latsCol);
HSSFDataValidation validate = new HSSFDataValidation(addressList, constraint);
sheet.AddValidationData(dataValidate);
2 주석 추가코드 는 다음 과 같 습 니 다:
HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();
// , 。
HSSFComment comment =
(HSSFComment)patriarch.CreateCellComment(new HSSFFClientAnchor(0, 0, 255,255, col1, 0, col1 + 2, 5));
comment.Author = "Dison";
comment.String = new HSSFRichTextString($" ");
cell.CellComment = comment;
3 읽 기 데이터공식 적 인 결 과 를 어떻게 해석 합 니까?
코드 는 다음 과 같 습 니 다:
if (row.GetCell(i).CellType.Equals(CellType.Formula))
{
var data = row.GetCell(i).RichStringCellValue;
}
공식 을 읽 기 를 원한 다 면 다음 과 같다.
var data = row.GetCell(i).ToString();
그러나 결과 에 등호 가 없 음 을 주의해 야 한다"="여기 서 나 는 시범 을 보 여 주 는 것 이기 때문에 부분 변 수 를 썼 다.날짜 형식 MM-dd-yy 전 yyy-MM-dd
엑셀 의 숫자 와 날 짜 는 모두 Numeric 형식 이기 때문에;다음 처리:
if (row.GetCell(i).CellType.Equals(CellType.Numeric))
{
ICell cell = row.GetCell(i);
short format = cell.CellStyle.DataFormat;
if (format != 0)
{
var data = cell.DateCellValue.ToString("yyyy-MM-dd");
}
else
{
var data = cell.NumericCellValue;
}
}
결어NPOI 는 상대 적 으로 성숙 한 엑셀 조작 창고 이기 도 하 다.인터넷 의 자 료 는 확실히 비교적 조잡 하 게 썼 다.그러나 프로그래머 로 서 인내심,특히 debug 를 배 워 야 한다.
흔 한 문제 해결
NPOI 주석 추가 기능 내 보 내기
//
HSSFPatriarch patr = (HSSFPatriarch)sheet.CreateDrawingPatriarch();
HSSFComment comment12 = patr.CreateComment(new HSSFClientAnchor(0, 0, 0, 0, 1, 2, 2, 3));//
comment12.String = new HSSFRichTextString(" !");
HSSFCell cell12 = (HSSFCell)headerRow.CreateCell(12);//
cell12.CellComment = comment12;
그러나 비교적 중요 한 부분 이 있 습 니 다.바로 주석 의 위치 와 크기 입 니 다.이것 은 HSSFClient Anchor 8 개의 매개 변수 가 제어 하 는 것 입 니 다.HSSFClient Anchor(0,0,0,0,1,2,2,3)를 간단하게 써 서 는 안 됩 니 다.각 칸 의 주석 위치 가 다 르 기 때문이다.그럼 어떻게 할 까요?당연히 매개 변 수 를 알 아야 한 다 는 뜻 입 니 다.
쉽게 말 하면:
HSSFClient Anchor(dx1,dy1,dx2,dy2,col 1,row 1,col 2,row 2)의 인자 에 대해 설명 할 필요 가 있 습 니 다.
내 가 만 든 예 로 말하자면:
HSSFComment comment1 = (HSSFComment)patr.CreateCellComment(new HSSFClientAnchor(255, 125, 1023, 150, colindex + 1, rowIndex - 1, colindex + 2, rowIndex + 4));
절대 인터넷 에 남 이 쓴 대로(0,0,0,0,1,2,2,3)하지 마 세 요. 모든 칸 의 주석 은 같은 위치 에 있 고 구덩이 에 빠 져 죽는다.
질문
// Excel
Workbook workbook = new HSSFWorkbook();
// :
Sheet sheet = workbook.createSheet("sheet1");
//
List<Product> productList = Ebean.getServer(GlobalDBControl.getDB()) .createQuery(Product.class, "find product where 1 = 1 and status = 0 and producttype is not null ") .findList();
//
String[] productNameArray = new String[productList.size()];
// peoduct , productName
for (int i = 0; i < productList.size(); i++)
{ Product product = productList.get(i);
productNameArray[i] = product.getTitle(); }
// sheet , excle sheet
Sheet hidden = workbook.createSheet("hidden");
// Cell cell = null;
// , sheet
for (int i = 0, length = productNameArray.length; i < length; i++)
{ //
String name = productNameArray[i];
// i ( )
Row row = hidden.createRow(i);
//
cell = row.createCell(0);
//
cell.setCellValue(name); }
// ,
Name namedCell = workbook.createName(); namedCell.setNameName("hidden");
//
namedCell.setRefersToFormula("hidden!$A$1:$A$" + productNameArray.length);
// , hidden sheet List
DVConstraint constraint = DVConstraint.createFormulaListConstraint("hidden");
// 3-65534
// (3, 65534, 0, 0) ====> ( , , , )
CellRangeAddressList regions = new CellRangeAddressList(3, 65534, 0, 0);
//
DataValidation dataValidation = new HSSFDataValidation(regions, constraint);
// sheet workbook.setSheetHidden(1, true);
// sheet.addValidationData(dataValidation);
// , ,
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
,
private void ExcelTo255(Workbook workbook,String sheetName,int sheetNameIndex,String[] sheetData,int firstRow,int lastRow,int firstCol,int lastCol){
// sheet , excle sheet
Sheet hidden = workbook.createSheet(sheetName);
//
Cell cell =null;
// , sheet
for (int i = 0, length = sheetData.length; i < length; i++){
//
String name = sheetData[i];
// i ( )
Row row = hidden.createRow(i);
//
cell = row.createCell(0);
//
cell.setCellValue(name);
}
// ,
Name namedCell = workbook.createName();
namedCell.setNameName(sheetName);
//
namedCell.setRefersToFormula(sheetName+"!$A$1:$A$" + sheetData.length);
// , hidden sheet List
DVConstraint constraint = DVConstraint.createFormulaListConstraint(sheetName);
// 3-65534
// (3, 65534, 2, 2) ====> ( , , , )
CellRangeAddressList regions = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
//
DataValidation dataValidation = new HSSFDataValidation(regions, constraint);
// sheet
workbook.setSheetHidden(sheetNameIndex, true);
//
workbook.getSheetAt(0).addValidationData(dataValidation);
}
날짜 형식 가 져 오기 혼란원인.
아마도 NPOI 가 져 올 때 엑셀 문서 의 셀 이 어떤 형식의 내용 인지 대충 판단 할 것 입 니 다.
Blank,Boolean,Numeric,String,Error,Formula 등 몇 가지 가 있 습 니 다.
하지만 날짜 가 없 는 경우 날짜 의 셀 은 Numeric(숫자)형식 으로 판 단 됩 니 다.
그래서 날짜 형식의 셀 은 숫자 형식 에 따라 값 을 가 져 옵 니 다.
그래서 단원 격 이 숫자 로 판 단 된 후에 날짜 형식 인지 아 닌 지 를 다시 판단 해 야 한다.
/// <summary>
///
/// </summary>
/// <param name="cell"></param>
/// <returns></returns>
private static object GetValueType(ICell cell)
{
if (cell == null)
return null;
switch (cell.CellType)
{
case CellType.Blank: //BLANK:
return null;
case CellType.Boolean: //BOOLEAN:
return cell.BooleanCellValue;
case CellType.Numeric: //NUMERIC:
short format = cell.CellStyle.DataFormat;
if (format != 0) { return cell.DateCellValue; } else { return cell.NumericCellValue; }
case CellType.String: //STRING:
return cell.StringCellValue;
case CellType.Error: //ERROR:
return cell.ErrorCellValue;
case CellType.Formula: //FORMULA:
default:
return "=" + cell.CellFormula;
}
}
주의 하 다.사용 시 Excel 의 긴 숫자 형식 입 니 다.그렇지 않 으 면 이러한 데 이 터 는 날짜 형식 으로 오 판 될 수 있 습 니 다.
예 를 들 어:0000123,2017001 등 이 유형의 셀 형식 을 처리 해 야 합 니 다.->"일반"형식 으로 설정 합 니 다.
이상 은 C\#NPOI 를 바탕 으로 엑셀 을 조작 하 는 상세 한 내용 입 니 다.C\#NPOI 조작 엑셀 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.