C\#NPOI 기반 엑셀 조작

10919 단어 C#NPOIexcel
1 칸 드 롭 다운 상자
개발 중 에 우 리 는 셀 에 드 롭 다운 상 자 를 설정 하 는 것 을 만 날 수 있 습 니 다.일반적으로 다음 과 같이 작성 할 수 있 습 니 다:

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)의 인자 에 대해 설명 할 필요 가 있 습 니 다.
  • dx1:시작 셀 의 x 오프셋;
  • dy1:시작 셀 의 y 오프셋;
  • dx2:셀 의 x 오프셋 을 종료 합 니 다.
  • dy2:셀 의 y 오프셋 을 종료 합 니 다.
  • col1:시작 셀 번호;
  • row 1:시작 셀 줄 번호;
  • col2:셀 번호 종료;
  • row 2:셀 줄 번호 종료;
  • 사실은 앞의 네 개 는 편 이 량 이 고 뒤의 네 개 는 주석 의 위치 와 크기 에 관계된다.
    내 가 만 든 예 로 말하자면:
    
    HSSFComment comment1 = (HSSFComment)patr.CreateCellComment(new HSSFClientAnchor(255, 125, 1023, 150, colindex + 1, rowIndex - 1,  colindex + 2, rowIndex + 4));
  • rowIndex 현재 셀 이 몇 번 째 줄 이 고 colindex 는 현재 셀 이 몇 번 째 열 입 니까?행렬 을 통 해 현재 셀 을 찾 을 수 있 습 니 다.
  • colindex + 1 위의 매개 변 수 는 col 1 입 니 다.  주석 시작 을 나타 내 는 위 치 는 현재 셀 의 다음 열 입 니 다.즉,원래 5 열 이 었 으 면 6 열 에 주석 을 달 았 습 니 다.
  • rowIndex-1 위의 매개 변 수 는 row 1 입 니 다.  가죽의 시작 위 치 는 현재 단원 격 행 수의 이전 줄,즉 원래 두 번 째 줄 이 었 으 면 첫 번 째 줄 에 주석 을 달 았 음 을 나타 낸다.
  • colindex + 2, rowIndex + 4  이 두 매개 변 수 는 셀 이 종 료 된 위치 입 니 다.   +2  +4  주석 의 크기 를 결정 합 니 다.이 치 는 colindex 와 같 습 니 다. + 1,rowIndex - 1 。
  • 그런데 NPOI 내 보 내기 에 구덩이 가 있어 요.   주석 크기 는 위치 에 있 는 셀 크기 에 따라 달라 집 니 다.  이 영향 은 크 지 않다  하면,만약,만약...   내 보 내 는 방법 을 바 꿀 수 밖 에 없어...
    절대 인터넷 에 남 이 쓴 대로(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 조작 엑셀 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기