এনপিওআই ব্যবহার করে কীভাবে ফাইল পড়বেন


87

আমি দেখেছি এনপিওআই সি # দিয়ে এক্সেল ফাইলগুলি লিখতে খুব ভাল।

তবে আমি সি # তে এক্সেল ফাইলগুলি খুলতে, পড়তে এবং সংশোধন করতে চাই।

কিভাবে আমি এটি করতে পারব?

উত্তর:


153

নীচে সাধারণ পড়ার উদাহরণ:

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;

//.....

private void button1_Click(object sender, EventArgs e)
{
    HSSFWorkbook hssfwb;
    using (FileStream file = new FileStream(@"c:\test.xls", FileMode.Open, FileAccess.Read))
    {
        hssfwb= new HSSFWorkbook(file);
    }

    ISheet sheet = hssfwb.GetSheet("Arkusz1");
    for (int row = 0; row <= sheet.LastRowNum; row++)
    {
        if (sheet.GetRow(row) != null) //null is when the row only contains empty cells 
        {
            MessageBox.Show(string.Format("Row {0} = {1}", row, sheet.GetRow(row).GetCell(0).StringCellValue));
        }
    }
}  

যাইহোক, এনপিওআই ওয়েবসাইটে এখানে ডাউনলোড বিভাগে উদাহরণ প্যাকেজ রয়েছে - সি # উদাহরণের একটি প্যাক। এটি চেষ্টা করুন, যদি আপনি এখনও না। :)


4
stackoverflow.com/questions/13333413/... একটি datatable কিভাবে ইনপুট এক্সেল ফাইল উপর ভাল উদাহরণ আছে।
রজার গভীর

তবে আমার সন্দেহ আছে, হাইপারলিংক ক্ষেত্রটি কীভাবে পড়বেন এবং সেই ক্ষেত্রটি দুটি সত্তায় বিভক্ত করবেন? আমি এগুলি বিভক্ত করতে এবং ব্যাকগ্রাউন্ডে হাইপারলিঙ্ক সহ একটি একক সত্তায় এটি দেখাতে চাই - ক্লিকযোগ্য- এবং লেবেলটি একটি ফ্রি টেক্সট হওয়া উচিত যা হাইপারলিংকের প্রতীক
ইউজারএজেডলজিপস অ্যাপস

এইচএসএসএফওয়ার্কবুক ক্লাসটি 2007 এর আগের এক্সেলের সংস্করণগুলির জন্য; নতুন সংস্করণগুলির জন্য আপনাকে এটি ব্যবহার করতে হবে: var workbook = new XSSFWorkbook (ফাইল স্ট্রিম);
টডজি

26

ওয়ার্কবুক কারখানার উপর নির্ভর করে ওয়ার্কবুকের অবজেক্টটি ইনস্ট্যান্ট করতে সহায়ক হতে পারে যেহেতু ফ্যাক্টরি পদ্ধতিটি আপনার জন্য এক্সলস বা এক্সএলএক্সএক্স সনাক্তকরণ করবে। তথ্যসূত্র: http://apache-poi.1045710.n5.nabble.com/How-to-check-for-uthor-excel-files- using-POI-without-checking-the-file-existance-td2341055.html

IWorkbook workbook = WorkbookFactory.Create(inputStream);

আপনি যদি শীটের নাম সম্পর্কে নিশ্চিত না হন তবে আপনি সূচী সম্পর্কে নিশ্চিত (0 ভিত্তিক) তবে আপনি শীটটি এইভাবে দখল করতে পারেন:

ISheet sheet = workbook.GetSheetAt(sheetIndex);

এরপরে আপনি mj82 থেকে গৃহীত উত্তরের দ্বারা সরবরাহিত কোডটি ব্যবহার করে সারিগুলির মাধ্যমে পুনরাবৃত্তি করতে পারেন


4
অান্তরিক ধন্যবাদ. যুক্ত করার মতো কয়েকটি জিনিস: আপনি যদি ব্যবহার করছেন তবে FileStream, inputStreamহওয়া উচিত FileMode.Openএবং FileAccess.Readএবং আপনার পরিবর্তনগুলি ডিস্কে সংরক্ষণ করার জন্য আপনাকে অনুমতি FileStreamসহ একটি নতুন খুলতে হবে FileAccess.Write; এটি কোনও ReadWriteস্ট্রিমের সাথে কাজ করছে বলে মনে হচ্ছে না । ছাড়াও Write(), NPOI এর IWorkbookএকটি আছে বলে মনে হচ্ছে না Save()টাইপ পদ্ধতি যে একটি ওয়ার্কবুক সংশোধন এবং এটি পরে সংরক্ষণ এক্সেল Interop মত সম্ভব হবে।
ট্রানজিস্টার 1

15

এক্সেল ফাইলগুলির সাথে কাজ করার জন্য আমি এনপিওআইকে খুব উপযোগী বলে মনে করি, এখানে আমার বাস্তবায়ন (মন্তব্যগুলি স্প্যানিশ ভাষায় রয়েছে, এর জন্য দুঃখিত):

এই পদ্ধতিটি একটি এক্সেল (উভয় এক্সএলএস বা এক্সএলএক্সএক্সএক্স) ফাইল খোলে এবং এটি একটি ডেটা টেবিলে রূপান্তর করে।

        /// <summary>Abre un archivo de Excel (xls o xlsx) y lo convierte en un DataTable.
    /// LA PRIMERA FILA DEBE CONTENER LOS NOMBRES DE LOS CAMPOS.</summary>
    /// <param name="pRutaArchivo">Ruta completa del archivo a abrir.</param>
    /// <param name="pHojaIndex">Número (basado en cero) de la hoja que se desea abrir. 0 es la primera hoja.</param>
    private DataTable Excel_To_DataTable(string pRutaArchivo, int pHojaIndex)
    {
        // --------------------------------- //
        /* REFERENCIAS:
         * NPOI.dll
         * NPOI.OOXML.dll
         * NPOI.OpenXml4Net.dll */
        // --------------------------------- //
        /* USING:
         * using NPOI.SS.UserModel;
         * using NPOI.HSSF.UserModel;
         * using NPOI.XSSF.UserModel; */
        // AUTOR: Ing. Jhollman Chacon R. 2015
        // --------------------------------- //
        DataTable Tabla = null;
        try
        {
            if (System.IO.File.Exists(pRutaArchivo))
            {

                IWorkbook workbook = null;  //IWorkbook determina si es xls o xlsx              
                ISheet worksheet = null;
                string first_sheet_name = "";

                using (FileStream FS = new FileStream(pRutaArchivo, FileMode.Open, FileAccess.Read))
                {
                    workbook = WorkbookFactory.Create(FS);          //Abre tanto XLS como XLSX
                    worksheet = workbook.GetSheetAt(pHojaIndex);    //Obtener Hoja por indice
                    first_sheet_name = worksheet.SheetName;         //Obtener el nombre de la Hoja

                    Tabla = new DataTable(first_sheet_name);
                    Tabla.Rows.Clear();
                    Tabla.Columns.Clear();

                    // Leer Fila por fila desde la primera
                    for (int rowIndex = 0; rowIndex <= worksheet.LastRowNum; rowIndex++)
                    {
                        DataRow NewReg = null;
                        IRow row = worksheet.GetRow(rowIndex);
                        IRow row2 = null;
                        IRow row3 = null;

                        if (rowIndex == 0)
                        {
                            row2 = worksheet.GetRow(rowIndex + 1); //Si es la Primera fila, obtengo tambien la segunda para saber el tipo de datos
                            row3 = worksheet.GetRow(rowIndex + 2); //Y la tercera tambien por las dudas
                        }

                        if (row != null) //null is when the row only contains empty cells 
                        {
                            if (rowIndex > 0) NewReg = Tabla.NewRow();

                            int colIndex = 0;
                            //Leer cada Columna de la fila
                            foreach (ICell cell in row.Cells)
                            {
                                object valorCell = null;
                                string cellType = "";
                                string[] cellType2 = new string[2];

                                if (rowIndex == 0) //Asumo que la primera fila contiene los titlos:
                                {
                                    for (int i = 0; i < 2; i++)
                                    {
                                        ICell cell2 = null;
                                        if (i == 0) { cell2 = row2.GetCell(cell.ColumnIndex); }
                                        else { cell2 = row3.GetCell(cell.ColumnIndex); }

                                        if (cell2 != null)
                                        {
                                            switch (cell2.CellType)
                                            {
                                                case CellType.Blank: break;
                                                case CellType.Boolean: cellType2[i] = "System.Boolean"; break;
                                                case CellType.String: cellType2[i] = "System.String"; break;
                                                case CellType.Numeric:
                                                    if (HSSFDateUtil.IsCellDateFormatted(cell2)) { cellType2[i] = "System.DateTime"; }
                                                    else
                                                    {
                                                        cellType2[i] = "System.Double";  //valorCell = cell2.NumericCellValue;
                                                    }
                                                    break;

                                                case CellType.Formula:                                                      
                                                    bool continuar = true;
                                                    switch (cell2.CachedFormulaResultType)
                                                    {
                                                        case CellType.Boolean: cellType2[i] = "System.Boolean"; break;
                                                        case CellType.String: cellType2[i] = "System.String"; break;
                                                        case CellType.Numeric:
                                                            if (HSSFDateUtil.IsCellDateFormatted(cell2)) { cellType2[i] = "System.DateTime"; }
                                                            else
                                                            {
                                                                try
                                                                {
                                                                    //DETERMINAR SI ES BOOLEANO
                                                                    if (cell2.CellFormula == "TRUE()") { cellType2[i] = "System.Boolean"; continuar = false; }
                                                                    if (continuar && cell2.CellFormula == "FALSE()") { cellType2[i] = "System.Boolean"; continuar = false; }
                                                                    if (continuar) { cellType2[i] = "System.Double"; continuar = false; }
                                                                }
                                                                catch { }
                                                            } break;
                                                    }
                                                    break;
                                                default:
                                                    cellType2[i] = "System.String"; break;
                                            }
                                        }
                                    }

                                    //Resolver las diferencias de Tipos
                                    if (cellType2[0] == cellType2[1]) { cellType = cellType2[0]; }
                                    else
                                    {
                                        if (cellType2[0] == null) cellType = cellType2[1];
                                        if (cellType2[1] == null) cellType = cellType2[0];
                                        if (cellType == "") cellType = "System.String";
                                    }

                                    //Obtener el nombre de la Columna
                                    string colName = "Column_{0}";
                                    try { colName = cell.StringCellValue; }
                                    catch { colName = string.Format(colName, colIndex); }

                                    //Verificar que NO se repita el Nombre de la Columna
                                    foreach (DataColumn col in Tabla.Columns)
                                    {
                                        if (col.ColumnName == colName) colName = string.Format("{0}_{1}", colName, colIndex);
                                    }

                                    //Agregar el campos de la tabla:
                                    DataColumn codigo = new DataColumn(colName, System.Type.GetType(cellType));
                                    Tabla.Columns.Add(codigo); colIndex++;
                                }
                                else
                                {
                                    //Las demas filas son registros:
                                    switch (cell.CellType)
                                    {
                                        case CellType.Blank: valorCell = DBNull.Value; break;
                                        case CellType.Boolean: valorCell = cell.BooleanCellValue; break;
                                        case CellType.String: valorCell = cell.StringCellValue; break;
                                        case CellType.Numeric:
                                            if (HSSFDateUtil.IsCellDateFormatted(cell)) { valorCell = cell.DateCellValue; }
                                            else { valorCell = cell.NumericCellValue; } break;
                                        case CellType.Formula:
                                            switch (cell.CachedFormulaResultType)
                                            {
                                                case CellType.Blank: valorCell = DBNull.Value; break;
                                                case CellType.String: valorCell = cell.StringCellValue; break;
                                                case CellType.Boolean: valorCell = cell.BooleanCellValue; break;
                                                case CellType.Numeric:
                                                    if (HSSFDateUtil.IsCellDateFormatted(cell)) { valorCell = cell.DateCellValue; }
                                                    else { valorCell = cell.NumericCellValue; }
                                                    break;
                                            }
                                            break;
                                        default: valorCell = cell.StringCellValue; break;
                                    }
                                    //Agregar el nuevo Registro
                                    if (cell.ColumnIndex <= Tabla.Columns.Count - 1) NewReg[cell.ColumnIndex] = valorCell;
                                }
                            }
                        }
                        if (rowIndex > 0) Tabla.Rows.Add(NewReg);
                    }
                    Tabla.AcceptChanges();
                }
            }
            else
            {
                throw new Exception("ERROR 404: El archivo especificado NO existe.");
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return Tabla;
    }

এই দ্বিতীয় পদ্ধতিটি অপোসাইটটি করে, একটি এক্সটেল ফাইলে একটি ডেটা টেবিল সংরক্ষণ করে, হ্যাঁ এটি হয় এক্সএলএস বা নতুন এক্সএলএসএক্স হতে পারে, আপনার চয়েজ!

        /// <summary>Convierte un DataTable en un archivo de Excel (xls o Xlsx) y lo guarda en disco.</summary>
    /// <param name="pDatos">Datos de la Tabla a guardar. Usa el nombre de la tabla como nombre de la Hoja</param>
    /// <param name="pFilePath">Ruta del archivo donde se guarda.</param>
    private void DataTable_To_Excel(DataTable pDatos, string pFilePath)
    {
        try
        {
            if (pDatos != null && pDatos.Rows.Count > 0)
            {
                IWorkbook workbook = null;
                ISheet worksheet = null;

                using (FileStream stream = new FileStream(pFilePath, FileMode.Create, FileAccess.ReadWrite))
                {
                    string Ext = System.IO.Path.GetExtension(pFilePath); //<-Extension del archivo
                    switch (Ext.ToLower())
                    {
                        case ".xls":
                            HSSFWorkbook workbookH = new HSSFWorkbook();
                            NPOI.HPSF.DocumentSummaryInformation dsi = NPOI.HPSF.PropertySetFactory.CreateDocumentSummaryInformation();
                            dsi.Company = "Cutcsa"; dsi.Manager = "Departamento Informatico";
                            workbookH.DocumentSummaryInformation = dsi;
                            workbook = workbookH;
                            break;

                        case ".xlsx": workbook = new XSSFWorkbook(); break;
                    }

                    worksheet = workbook.CreateSheet(pDatos.TableName); //<-Usa el nombre de la tabla como nombre de la Hoja

                    //CREAR EN LA PRIMERA FILA LOS TITULOS DE LAS COLUMNAS
                    int iRow = 0;
                    if (pDatos.Columns.Count > 0)
                    {
                        int iCol = 0;
                        IRow fila = worksheet.CreateRow(iRow);
                        foreach (DataColumn columna in pDatos.Columns)
                        {
                            ICell cell = fila.CreateCell(iCol, CellType.String);
                            cell.SetCellValue(columna.ColumnName);
                            iCol++;
                        }
                        iRow++;
                    }

                    //FORMATOS PARA CIERTOS TIPOS DE DATOS
                    ICellStyle _doubleCellStyle = workbook.CreateCellStyle();
                    _doubleCellStyle.DataFormat = workbook.CreateDataFormat().GetFormat("#,##0.###");

                    ICellStyle _intCellStyle = workbook.CreateCellStyle();
                    _intCellStyle.DataFormat = workbook.CreateDataFormat().GetFormat("#,##0");

                    ICellStyle _boolCellStyle = workbook.CreateCellStyle();
                    _boolCellStyle.DataFormat = workbook.CreateDataFormat().GetFormat("BOOLEAN");

                    ICellStyle _dateCellStyle = workbook.CreateCellStyle();
                    _dateCellStyle.DataFormat = workbook.CreateDataFormat().GetFormat("dd-MM-yyyy");

                    ICellStyle _dateTimeCellStyle = workbook.CreateCellStyle();
                    _dateTimeCellStyle.DataFormat = workbook.CreateDataFormat().GetFormat("dd-MM-yyyy HH:mm:ss");

                    //AHORA CREAR UNA FILA POR CADA REGISTRO DE LA TABLA
                    foreach (DataRow row in pDatos.Rows)
                    {
                        IRow fila = worksheet.CreateRow(iRow);
                        int iCol = 0;
                        foreach (DataColumn column in pDatos.Columns)
                        {
                            ICell cell = null; //<-Representa la celda actual                               
                            object cellValue = row[iCol]; //<- El valor actual de la celda

                            switch (column.DataType.ToString())
                            {
                                case "System.Boolean":
                                    if (cellValue != DBNull.Value)
                                    {
                                        cell = fila.CreateCell(iCol, CellType.Boolean);

                                        if (Convert.ToBoolean(cellValue)) { cell.SetCellFormula("TRUE()"); }
                                        else { cell.SetCellFormula("FALSE()"); }

                                        cell.CellStyle = _boolCellStyle;
                                    }
                                    break;

                                case "System.String":
                                    if (cellValue != DBNull.Value)
                                    {
                                        cell = fila.CreateCell(iCol, CellType.String);
                                        cell.SetCellValue(Convert.ToString(cellValue));
                                    }
                                    break;

                                case "System.Int32":
                                    if (cellValue != DBNull.Value)
                                    {
                                        cell = fila.CreateCell(iCol, CellType.Numeric);
                                        cell.SetCellValue(Convert.ToInt32(cellValue));
                                        cell.CellStyle = _intCellStyle;
                                    }
                                    break;
                                case "System.Int64":
                                    if (cellValue != DBNull.Value)
                                    {
                                        cell = fila.CreateCell(iCol, CellType.Numeric);
                                        cell.SetCellValue(Convert.ToInt64(cellValue));
                                        cell.CellStyle = _intCellStyle;
                                    }
                                    break;
                                case "System.Decimal":
                                    if (cellValue != DBNull.Value)
                                    {
                                        cell = fila.CreateCell(iCol, CellType.Numeric);
                                        cell.SetCellValue(Convert.ToDouble(cellValue));
                                        cell.CellStyle = _doubleCellStyle;
                                    }
                                    break;
                                case "System.Double":
                                    if (cellValue != DBNull.Value)
                                    {
                                        cell = fila.CreateCell(iCol, CellType.Numeric);
                                        cell.SetCellValue(Convert.ToDouble(cellValue));
                                        cell.CellStyle = _doubleCellStyle;
                                    }
                                    break;

                                case "System.DateTime":
                                    if (cellValue != DBNull.Value)
                                    {
                                        cell = fila.CreateCell(iCol, CellType.Numeric);
                                        cell.SetCellValue(Convert.ToDateTime(cellValue));

                                        //Si No tiene valor de Hora, usar formato dd-MM-yyyy
                                        DateTime cDate = Convert.ToDateTime(cellValue);
                                        if (cDate != null && cDate.Hour > 0) { cell.CellStyle = _dateTimeCellStyle; }
                                        else { cell.CellStyle = _dateCellStyle; }
                                    }
                                    break;
                                default:
                                    break;
                            }
                            iCol++;
                        }
                        iRow++;
                    }

                    workbook.Write(stream);
                    stream.Close();
                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

এই 2 টি পদ্ধতির সাহায্যে আপনি একটি এক্সেল ফাইল খুলতে পারেন, এটি একটি ডেটা টেবিলের মধ্যে লোড করতে পারেন, আপনার পরিবর্তনগুলি করতে পারেন এবং এটিকে আবার কোনও এক্সেল ফাইলে সংরক্ষণ করতে পারেন।

আশা করি আপনি ছেলেরা এই উপকারটি পেয়েছেন।


এক্সএলএসএক্স ফাইলটি পড়তে হবে ICSharpCode.SharpZipLib.dllএবং NPOI.OpenXmlFormats.dllএর রেফারেন্সগুলিও প্রয়োজন
'11 এ

4
উপরে কোড কাজ করে। স্প্যানিশ মন্তব্যের অর্থ পেতে আমি গুগল অনুবাদক ব্যবহার করেছি। সাহায্যের জন্য ধন্যবাদ..!
দেবমজে

@ দেভএমজে ভাগ্যক্রমে কোডটির জন্য জি ট্রান্সলেটর এক্সডি দরকার নেই
ঝলম্যান

আপনি যদি এনপিওআই.ম্যাপার ব্যবহার না করেন তবে সরল পঠন এবং শিট ম্যাপিংয়ের জন্য এটি ব্যবহারের কথা বিবেচনা করুন: github.com/hidegh/NPOI. এক্সটেনশনস
বাহি

8

জ্যানুলেলের ইঙ্গিত অনুসারে, আপনি যদি ওয়ার্কবুক ফ্যাক্টরি ব্যবহার করেন তবে এটি কোন এক্সটেনশনটি তা সনাক্ত করার দরকার নেই, এটি আপনার জন্য এটি করবে। এক্সেল ফাইলগুলি পড়ার জন্য এবং স্কয়ার ডাটাবেসে ইমেল ঠিকানা আমদানি করার জন্য আমাকে সম্প্রতি এনপিওআই ব্যবহার করে একটি সমাধান প্রয়োগ করতে হয়েছিল। আমার মূল সমস্যাটি হ'ল আমি সম্ভবত বিভিন্ন গ্রাহকদের কাছ থেকে প্রায় 12 টি বিভিন্ন এক্সেল লেআউট পেতে যাচ্ছিলাম তাই আমার এমন কিছু দরকার যা খুব বেশি কোড ছাড়াই দ্রুত পরিবর্তন করা যায়। আমি এনপোই.ম্যাপার ব্যবহার করে শেষ করেছি যা একটি দুর্দান্ত সরঞ্জাম! অত্যন্ত বাঞ্ছনীয়!

এখানে আমার সম্পূর্ণ সমাধান:

using System.IO;
using System.Linq;
using Npoi.Mapper;
using Npoi.Mapper.Attributes;
using NPOI.SS.UserModel;

namespace JobCustomerImport.Processors
{
    public class ExcelEmailProcessor
    {
        private UserManagementServiceContext DataContext { get; }

        public ExcelEmailProcessor(int customerNumber)
        {
            DataContext = new UserManagementServiceContext();
        }

        public void Execute(string localPath, int sheetIndex)
        {
            IWorkbook workbook;
            using (FileStream file = new FileStream(localPath, FileMode.Open, FileAccess.Read))
            {
                workbook = WorkbookFactory.Create(file);
            }

            var importer = new Mapper(workbook);
            var items = importer.Take<MurphyExcelFormat>(sheetIndex);
            foreach(var item in items)
            {
                var row = item.Value;
                if (string.IsNullOrEmpty(row.EmailAddress))
                    continue;

                UpdateUser(row);
            }

            DataContext.SaveChanges();
        }

        private void UpdateUser(MurphyExcelFormat row)
        {
            //LOGIC HERE TO UPDATE A USER IN DATABASE...
        }

        private class MurphyExcelFormat
        {
            [Column("District")]
            public int District { get; set; }

            [Column("DM")]
            public string FullName { get; set; }

            [Column("Email Address")]
            public string EmailAddress { get; set; }

            [Column(3)]
            public string Username { get; set; }

            public string FirstName
            {
                get
                {
                    return Username.Split('.')[0];
                }
            }

            public string LastName
            {
                get
                {
                    return Username.Split('.')[1];
                }
            }
        }
    }
}

এক্সপি আমদানির সমাধান হিসাবে আমি এনপিওআই + এনপোই.ম্যাপার ( ডনি টিয়ান থেকে ) এর সাথে এত খুশি যে আমি এটি সম্পর্কে একটি ব্লগ পোস্ট লিখেছি, উপরের এই কোডটি সম্পর্কে আরও বিশদে যাচ্ছি। আপনি যদি চান এখানে এটি পড়তে পারেন: এক্সেল ফাইলগুলি আমদানির সবচেয়ে সহজ উপায় । এই সমাধানটির সর্বোত্তম জিনিসটি হ'ল এটি সার্ভারলেস অ্যাজুরি / ক্লাউড পরিবেশে পুরোপুরি সঞ্চালিত হয় যা আমি অন্যান্য এক্সেল সরঞ্জাম / লাইব্রেরির সাথে পেতে পারি নি।


আমি এখনও এটিতে কিছু স্থাপত্যগত পরিবর্তনের জন্য অপেক্ষা করছি (2 বছর), কারণ এটির জন্য খুব বেশি বিশেষ কিছু ক্ষেত্রে অতিরিক্ত প্রক্রিয়াজাতকরণ প্রয়োজন। এ কারণেই আমি একটি সাধারণ পাঠক এবং ম্যাপার তৈরি করেছি, এটির জন্য কিছু অতিরিক্ত লাইন প্রয়োজন, তবে আপনি কী এবং কীভাবে পাবেন তা 100% আপনি নিয়ন্ত্রণ করেন: github.com/hidegh/NPOI. এক্সটেনশনগুলি
বাহি

6
private DataTable GetDataTableFromExcel(String Path)
    {
        XSSFWorkbook wb;
        XSSFSheet sh;
        String Sheet_name;

        using (var fs = new FileStream(Path, FileMode.Open, FileAccess.Read))
        {
            wb = new XSSFWorkbook(fs);

               Sheet_name= wb.GetSheetAt(0).SheetName;  //get first sheet name
        }
        DataTable DT = new DataTable();
        DT.Rows.Clear();
        DT.Columns.Clear();

        // get sheet
        sh = (XSSFSheet)wb.GetSheet(Sheet_name);

        int i = 0;
        while (sh.GetRow(i) != null)
        {
            // add neccessary columns
            if (DT.Columns.Count < sh.GetRow(i).Cells.Count)
            {
                for (int j = 0; j < sh.GetRow(i).Cells.Count; j++)
                {
                    DT.Columns.Add("", typeof(string));
                }
            }

            // add row
            DT.Rows.Add();

            // write row value
            for (int j = 0; j < sh.GetRow(i).Cells.Count; j++)
            {
                var cell = sh.GetRow(i).GetCell(j);

                if (cell != null)
                {
                    // TODO: you can add more cell types capatibility, e. g. formula
                    switch (cell.CellType)
                    {
                        case NPOI.SS.UserModel.CellType.Numeric:
                            DT.Rows[i][j] = sh.GetRow(i).GetCell(j).NumericCellValue;
                            //dataGridView1[j, i].Value = sh.GetRow(i).GetCell(j).NumericCellValue;

                            break;
                        case NPOI.SS.UserModel.CellType.String:
                            DT.Rows[i][j] = sh.GetRow(i).GetCell(j).StringCellValue;

                            break;
                    }
                }
            }

            i++;
        }

        return DT;
    }

4
private static ISheet GetFileStream(string fullFilePath)
    {
        var fileExtension = Path.GetExtension(fullFilePath);
        string sheetName;
        ISheet sheet = null;
        switch (fileExtension)
        {
            case ".xlsx":
                using (var fs = new FileStream(fullFilePath, FileMode.Open, FileAccess.Read))
                {
                    var wb = new XSSFWorkbook(fs);
                    sheetName = wb.GetSheetAt(0).SheetName;
                    sheet = (XSSFSheet) wb.GetSheet(sheetName);
                }
                break;
            case ".xls":
                using (var fs = new FileStream(fullFilePath, FileMode.Open, FileAccess.Read))
                {
                    var wb = new HSSFWorkbook(fs);
                    sheetName = wb.GetSheetAt(0).SheetName;
                    sheet = (HSSFSheet) wb.GetSheet(sheetName);
                }
                break;
        }
        return sheet;
    }

    private static DataTable GetRequestsDataFromExcel(string fullFilePath)
    {
        try
        {
            var sh = GetFileStream(fullFilePath);
            var dtExcelTable = new DataTable();
            dtExcelTable.Rows.Clear();
            dtExcelTable.Columns.Clear();
            var headerRow = sh.GetRow(0);
            int colCount = headerRow.LastCellNum;
            for (var c = 0; c < colCount; c++)
                dtExcelTable.Columns.Add(headerRow.GetCell(c).ToString());
            var i = 1;
            var currentRow = sh.GetRow(i);
            while (currentRow != null)
            {
                var dr = dtExcelTable.NewRow();
                for (var j = 0; j < currentRow.Cells.Count; j++)
                {
                    var cell = currentRow.GetCell(j);

                    if (cell != null)
                        switch (cell.CellType)
                        {
                            case CellType.Numeric:
                                dr[j] = DateUtil.IsCellDateFormatted(cell)
                                    ? cell.DateCellValue.ToString(CultureInfo.InvariantCulture)
                                    : cell.NumericCellValue.ToString(CultureInfo.InvariantCulture);
                                break;
                            case CellType.String:
                                dr[j] = cell.StringCellValue;
                                break;
                            case CellType.Blank:
                                dr[j] = string.Empty;
                                break;
                        }
                }
                dtExcelTable.Rows.Add(dr);
                i++;
                currentRow = sh.GetRow(i);
            }
            return dtExcelTable;
        }
        catch (Exception e)
        {
            throw;
        }
    }

এক্সেল ফাইলটি পড়ুন এবং ফাইল এক্সটেনশনের ভিত্তিতে হয় এক্সলস বা এক্সএলএক্সএক্স ডেটেবলে রূপান্তর করুন।
শৈলেশ বি। রাথি

সাবধান, ফাইলের বিভিন্ন কলামের আকার ক্রাশ হবে। এটি অনুধাবন করা সহজ নয়, সুতরাং ডাঃ [জে] = সেল.স্ট্রিংসেলভ্যালুতে ব্যতিক্রম পেতে প্রথমে ট্রাই-ক্যাচ ব্লকটি কেটে ফেলুন; এবং লক্ষ্য করুন যে আপনি ডিআর-এ কলামের সংক্ষিপ্ত;
রজার গভীর

3

যেহেতু আপনি xls ফাইলটি পড়তে এবং সংশোধন করতে বলেছেন আমি আপনার প্রয়োজন অনুসারে @ mj82 এর উত্তর পরিবর্তন করেছি।

HSSFWorkbookনেই Saveপদ্ধতি, কিন্তু এটা আছে Writeএকটি স্ট্রিম করতে।

static void Main(string[] args)
        {
            string filepath = @"C:\test.xls";

            HSSFWorkbook hssfwb;

            using (FileStream file = new FileStream(filepath, FileMode.Open, FileAccess.Read))
            {
                hssfwb = new HSSFWorkbook(file);
            }

            ISheet sheet = hssfwb.GetSheetAt(0);

            for (int row = 0; row <= sheet.LastRowNum; row++)
            {
                if (sheet.GetRow(row) != null) //null is when the row only contains empty cells 
                {
                    // Set new cell value
                    sheet.GetRow(row).GetCell(0).SetCellValue("foo");
                    Console.WriteLine("Row {0} = {1}", row, sheet.GetRow(row).GetCell(0).StringCellValue);
                }
            }

            // Save the file
            using (FileStream file = new FileStream(filepath, FileMode.Open, FileAccess.Write))
            {
                hssfwb.Write(file);
            }

            Console.ReadLine();
        }

এক্সেলকে কীভাবে পরিবর্তন করতে হয় তা দেখানোর জন্য ধন্যবাদ। এটি আমাকে অনেক সাহায্য করেছে। এখানেও একটি ভাল উদাহরণ। এটি আশা করা আমার মতো অন্যান্য এনপিওআইয়ের শুরুতে সহায়ক।
18

0

আপনি যদি এনপিওআই.ম্যাপারটি ব্যবহার করতে না চান, তবে আমি আপনাকে এই সমাধানটি চেক করার পরামর্শ দিচ্ছি - এটি এক্সেল সেলটি বিভিন্ন ধরণের পাঠ্য পরিচালনা করে এবং একটি সাধারণ আমদানি সহায়কও রয়েছে: https://github.com/hidegh/ এনপিওআই. এক্সটেনশনস

var data = sheet.MapTo<OrderDetails>(true, rowMapper =>
{
  // map singleItem
  return new OrderDetails()
  {
    Date = rowMapper.GetValue<DateTime>(SheetColumnTitles.Date),

    // use reusable mapper for re-curring scenarios
    Region = regionMapper(rowMapper.GetValue<string>(SheetColumnTitles.Region)),

    Representative = rowMapper.GetValue<string>(SheetColumnTitles.Representative),
    Item = rowMapper.GetValue<string>(SheetColumnTitles.Item),
    Units = rowMapper.GetValue<int>(SheetColumnTitles.Units),
    UnitCost = rowMapper.GetValue<decimal>(SheetColumnTitles.UnitCost),
    Total = rowMapper.GetValue<decimal>(SheetColumnTitles.Total),

    // read date and total as string, as they're displayed/formatted on the excel
    DateFormatted = rowMapper.GetValue<string>(SheetColumnTitles.Date),
    TotalFormatted = rowMapper.GetValue<string>(SheetColumnTitles.Total)
  };
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.