代码改变世界

C#操作EXCEL之NPOI

2012-11-18 21:59  sql_manage  阅读(1071)  评论(0)    收藏  举报

 
命名空间
using NPOI;
using NPOI.HPSF;
using NPOI.HSSF;
using NPOI.HSSF.UserModel;
using NPOI.HSSF.Util;
using NPOI.POIFS;
using NPOI.Util;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.SS.Formula;
using NPOI.SS;

----------------------------------------------------------------------------------------------------------

 /// <summary>
        /// 将dataTable中所有数据导出至excel
        /// </summary>
        /// <param name="dt">datatable</param>
        /// <param name="savePath">保存路径</param>
        /// <param name="sheetName">表单名称</param>
        private void createExcel(DataTable dt, string savePath, string sheetName)
        {
            if (dt.Rows.Count > 0)
            {
                HSSFWorkbook workbook = new HSSFWorkbook();
                HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet(sheetName);
                //设置标题行样式
                HSSFFont font = (HSSFFont)workbook.CreateFont();
                font.Boldweight = 600;

                HSSFCellStyle styleTitle = (HSSFCellStyle)workbook.CreateCellStyle();
                styleTitle.SetFont(font);

                //首先生成标题
                sheet.CreateRow(0);
                for (int col = 0; col < dt.Columns.Count; col++)
                {
                    string colName = dt.Columns[col].ColumnName.Trim();//获取标题名
                    //sheet.CreateRow(0).CreateCell(col).SetCellValue(colName);
                    //IRow row0 = sheet.GetRow(0);
                    sheet.GetRow(0).CreateCell(col).SetCellValue(colName);
                    sheet.GetRow(0).GetCell(col).CellStyle = styleTitle;
                    sheet.SetColumnWidth(col, 28 * 256);//设置列宽

                }
                //遍历所有数据并填充
                for (int row = 0; row < dt.Rows.Count; row++)
                {
                    int currentRow = row + 1;//因为第0行是标题
                    sheet.CreateRow(currentRow);
                    for (int colC = 0; colC < dt.Columns.Count; colC++)
                    {
                        sheet.GetRow(currentRow).CreateCell(colC).SetCellValue(dt.Rows[row][colC].ToString());
                    }
                }
                //保存excel
                FileStream fileSave = new FileStream(savePath, FileMode.Create);
                workbook.Write(fileSave);
                fileSave.Close();
            }
        }

---------------------------------------------------------------------------------------------------------------------------------------
生成图片

string picSavePath = AppDomain.CurrentDomain.BaseDirectory + "UploadFiles\\EnterpriseLogo\\" + EnterpriseLogo_str;//因为这里是图片的名称,所以直接加上去
                    byte[] bytes = System.IO.File.ReadAllBytes(picSavePath);
                    string extend=EnterpriseLogo_str.Substring(EnterpriseLogo_str.LastIndexOf("."));
                    int pictureIdx = workbook.AddPicture(bytes, PictureType.JPEG);//默认值为jpg
                    if (extend.ToLower() == ".png")
                    {
                        pictureIdx = workbook.AddPicture(bytes, PictureType.PNG);
                    }
                    if (extend.ToLower() == ".emf")
                    {
                        pictureIdx = workbook.AddPicture(bytes, PictureType.EMF);
                    }
                    try
                    {
                        HSSFPatriarch patriarch = (HSSFPatriarch)sheet1.CreateDrawingPatriarch();
                        HSSFClientAnchor anchor = new HSSFClientAnchor(50, 50, 800, 50, 4, 1, 5, 4);//注意这里的参数
                        HSSFPicture pict = (HSSFPicture)patriarch.CreatePicture(anchor, pictureIdx);
                    }
                    catch { }//这里不报错出来

--------------------------------------------------------------------------------------------------------------

数据少的下拉列表

 CellRangeAddressList regions_sex = new CellRangeAddressList(2, 2, 3, 3);
            DVConstraint constrain_sex = DVConstraint.CreateExplicitListConstraint(new string[] { "男性", "女性" });
            HSSFDataValidation dataValidate_sex = new HSSFDataValidation(regions_sex, constrain_sex);
            templeteSheet.AddValidationData(dataValidate_sex);

-------------------------------------------------------------------------------------------------------------

数据多的下拉列表

 HSSFName rang = (HSSFName)workbook.CreateName();
            string rowcount ="Sheet3!$A$1:$A$"+ DomainsListStr.Length.ToString();
            rang.RefersToFormula = rowcount;
            rang.NameName = "DomainsList";

CellRangeAddressList regions_domains = new CellRangeAddressList(hang, hang, lie, lie);
                DVConstraint constrain_domains = DVConstraint.CreateFormulaListConstraint("DomainsList");
                HSSFDataValidation dataValidate_domains = new HSSFDataValidation(regions_domains, constrain_domains);
                templeteSheet.AddValidationData(dataValidate_domains);//长于255报错