NPOI实现excel的读取与写入

NPOI简介

NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。
NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目。

安装

NuGet管理工具中搜索NPOI,进行安装


NPOI安装

读取excel数据

/// <summary>
/// Excel转换成DataTable(.xls)
/// </summary>
/// <param name="filePath">Excel文件路径</param>
/// <returns></returns>
public static DataTable ExcelToDataTable(string filePath)
{
    var dt = new DataTable();
    using (var file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
    {
        var hssfworkbook = new HSSFWorkbook(file);
        var sheet = hssfworkbook.GetSheetAt(0);
        for (var j = 0; j < 5; j++)
        {
            dt.Columns.Add(Convert.ToChar(((int)'A') + j).ToString());
        }
        var rows = sheet.GetRowEnumerator();
        while (rows.MoveNext())
        {
            var row = (HSSFRow)rows.Current;
            var dr = dt.NewRow();
            for (var i = 0; i < row.LastCellNum; i++)
            {
                var cell = row.GetCell(i);
                if (cell == null)
                {
                    dr[i] = null;
                }
                else
                {
                    switch (cell.CellType)
                    {
                        case CellType.Blank:
                            dr[i] = "[null]";
                            break;
                        case CellType.Boolean:
                            dr[i] = cell.BooleanCellValue;
                            break;
                        case CellType.Numeric:
                            dr[i] = cell.ToString();
                            break;
                        case CellType.String:
                            dr[i] = cell.StringCellValue;
                            break;
                        case CellType.Formula:
                            try
                            {
                                dr[i] = cell.NumericCellValue;
                            }
                            catch
                            {
                                dr[i] = cell.StringCellValue;
                            }
                            break;
                        case CellType.Error:
                            break;
                        default:
                            dr[i] = "=" + cell.CellFormula;
                            break;
                    }
                }
            }
            dt.Rows.Add(dr);
        }
    }
    return dt;
}

写入excle

var workBook = new HSSFWorkbook();
ISheet sheet = null;
ICellStyle style = null;
style = workBook.CreateCellStyle();
//设置左对齐
style.Alignment = HorizontalAlignment.Left;
//style.BorderLeft = BorderStyle.Thin;
style.BorderRight = BorderStyle.Thin;
//style.BorderTop = BorderStyle.Thin;
style.BorderBottom = BorderStyle.Thin;


sheet = workBook.CreateSheet("sheet1");//创建表格

IRow row = sheet.CreateRow(0);
row.CreateCell(0).SetCellValue("序号");
row.GetCell(0).CellStyle = style;
row.CreateCell(1).SetCellValue("姓名");
row.GetCell(1).CellStyle = style;
        

workBook.SetActiveSheet(0);//设置默认表格
string filePath=@"c:\test.xls";
using (FileStream fs = new FileStream(filePath, FileMode.Create))
{
    workBook.Write(fs);
}            

写入已有的excel

/// <summary>
/// 向已存在的excel写入数据
/// </summary>
/// <param name="excelPath">excel路径</param>
/// <param name="rowIndex">开始行索引</param>
/// <param name="cellData">列索引<列索引,单元格值></param>
public void addExcelData(string excelPath, int rowIndex, IDictionary<int, string> cellData)
{
    FileStream fs = new FileStream(excelPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);//读取流
    POIFSFileSystem ps = new POIFSFileSystem(fs);
    HSSFWorkbook workbook = new HSSFWorkbook(ps);
    ISheet sheet = workbook.GetSheetAt(0);//获取工作表

    //设置列宽
    SetColumnWidth(sheet, 0, 20);
    SetColumnWidth(sheet, 1, 10);
    //IRow row = sheet.GetRow(rowIndex); //获得已有的行
    IRow row = sheet.CreateRow(rowIndex); //创建新行


    ICell cell = null;
    ICellStyle style = null;
    foreach (KeyValuePair<int, string> keyValue in cellData)
    {
        if (keyValue.Key == 1)
        {
            cell = row.CreateCell(keyValue.Key);
            cell.SetCellValue(keyValue.Value);
           
            style = workbook.CreateCellStyle();
            //设置左对齐
            style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.LEFT;
            //设置边框
            style.BorderLeft = BorderStyle.Thin;
            style.BorderRight = BorderStyle.Thin;
            style.BorderTop = BorderStyle.Thin;
            style.BorderBottom = BorderStyle.Thin;
            //设置填充色
            styleN.FillForegroundColor = IndexedColors.Red.Index;
            styleN.FillPattern = FillPattern.SolidForeground;
            //设置换行(若要单元格内换行必须加下面一句)
            style.WrapText = true;
            cell.CellStyle = style;
        }
        else
        {
            cell = row.CreateCell(keyValue.Key);
            cell.SetCellValue(keyValue.Value);

            //设置居中
            style = workbook.CreateCellStyle();
            style.VerticalAlignment = VerticalAlignment.CENTER;
            style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;
            //设置边框
            style.BorderLeft = BorderStyle.Thin;
            style.BorderRight = BorderStyle.Thin;
            style.BorderTop = BorderStyle.Thin;
            style.BorderBottom = BorderStyle.Thin;
            cell.CellStyle = style;
        }
    }

    FileStream fout = new FileStream(excelPath, FileMode.Open, FileAccess.Write, FileShare.ReadWrite);//写入流
    fout.Flush();
    workbook.Write(fout);//写入文件
    workbook = null;
    fout.Close();
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容