데이터를 읽거나 생성할 수 있는 ExcelHelper 범용 클래스

25395 단어 Excel
EXCEL 데이터를 읽거나 생성하는 방법은 다음과 같습니다.
1. OFFICE EXCEL 구성 요소를 통해 장점: EXCEL 파일을 읽고 생성하는 것이 편리하고 단점: 서버에 OFFICE 소프트웨어를 설치해야 하며 프로세스가 제때에 실행되지 않음
2. 제3자 구성 요소(예: NPOI)를 통해 장점: OFFICE 소프트웨어를 설치할 필요가 없고 단점: 제3자 구성 요소를 도입해야 한다. 물론 이것은 비교적 강하다.
3. EXCEL을 데이터베이스로 삼아 연결한 후 SQL 문장을 활용하여 읽고 쓰면 HTML 표로 직접 연결할 수 있다. 장점: 별도의 구성 요소가 필요 없고 단점: SQL과 HTML 표를 연결하는 것이 번거롭다.
세 가지 방법은 내가 모두 사용한 적이 있다. 만약에 BS 사이트 프로그램을 개발하면 두 번째, 세 번째 방법을 사용하고, CS 구조를 개발하면 첫 번째 또는 두 번째 방법을 사용하는 것을 제안한다.
다음은 제가 BS단에 쓴 ExcelHelper 범용 클래스입니다. 데이터를 읽거나 생성하는 데 사용할 수 있습니다. 비교적 편리합니다. 기술 원리는 상술한 세 번째 방법입니다. 코드는 다음과 같습니다. 결함이 있을 수 있습니다. 고수들이 이해합니다.
namespace ASOTS.Models
{
    public abstract class ExcelHelper
    {
        /// <summary>
        ///  EXCEL sheet 
        /// </summary>
        /// <returns></returns>
        public static DataTable GetTableFromExcel(string filePath, string fileExt, string tableName, int colsCount)
        {
            string connstr = null;
            if (fileExt == ".xls")
            {
                connstr = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + filePath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
            }
            else
            {
                connstr = "Provider = Microsoft.ACE.OLEDB.12.0 ; Data Source =" + filePath + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'";
            }

            using (OleDbConnection excelConn = new OleDbConnection(connstr))
            {
                excelConn.Open();

                // EXCEL 
                DataTable schemaTable = excelConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" });

                // sheet 
                DataView schemaView = new DataView(schemaTable);
                schemaView.RowFilter = "TABLE_NAME='" + tableName + "$'";
                schemaTable = schemaView.ToTable();

                if (schemaTable != null && schemaTable.Rows.Count > 0)
                {
                    DataTable schemaTable_Cols = excelConn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, tableName + "$", null });
                    schemaView = new DataView(schemaTable_Cols);
                    schemaView.RowFilter = "ORDINAL_POSITION<=" + colsCount.ToString();
                    schemaView.Sort = "ORDINAL_POSITION asc";
                    schemaTable_Cols = schemaView.ToTable();
                    string selectCols = "";
                    for (int i = 0; i < schemaTable_Cols.Rows.Count; i++)
                    {
                        selectCols += "," + schemaTable_Cols.Rows[i]["COLUMN_NAME"].ToString();
                    }

                    selectCols = selectCols.Substring(1);

                    // sheet 
                    string strSql = "select " + selectCols + " from [" + tableName + "$]";
                    OleDbDataAdapter da = new OleDbDataAdapter(strSql, excelConn);
                    DataSet ds = new DataSet();
                    da.Fill(ds, tableName);
                    excelConn.Close();
                    return ds.Tables[tableName];
                }
                else
                {
                    excelConn.Close();
                    return null;
                }
            }

        }

        /// <summary>
        ///  HTML 
        /// </summary>
        /// <param name="data"></param>
        /// <param name="tableAttributes"></param>
        /// <param name="headers"></param>
        /// <returns></returns>
        public static string SetDataToHtmlTable(IEnumerable data, string tableAttributes, params KeyValuePair<string, string>[] headers)
        {
            StringBuilder htmlTableBuilder = new StringBuilder();
            htmlTableBuilder.AppendFormat("<table {0}>", tableAttributes);

            if (data.GetEnumerator().Current == null)
            {
                throw new Exception("");
            }

            Type t = data.GetEnumerator().Current.GetType();

            string[] cellIndexs = new string[headers.Count()];

            htmlTableBuilder.Append("<tr>");
            for (int i = 0; i < headers.Count(); i++)
            {
                cellIndexs[i] = headers[i].Key;
                htmlTableBuilder.AppendFormat("<th>{0}</th>", headers[i].Value);
            }
            htmlTableBuilder.Append("</tr>");

            foreach (var item in data)
            {
                htmlTableBuilder.Append("<tr>");
                for (int i = 0; i < cellIndexs.Length; i++)
                {
                    object pValue = t.GetProperty(cellIndexs[i]).GetValue(item, null);
                    htmlTableBuilder.AppendFormat("<td>{0}</td>", pValue);
                }
                htmlTableBuilder.Append("</tr>");
            }

            htmlTableBuilder.Append("</table>");

            return htmlTableBuilder.ToString();
        }



        /// <summary>
        ///  DataTable HTML 
        /// </summary>
        /// <param name="data"></param>
        /// <param name="tableAttributes"></param>
        /// <param name="headers"></param>
        /// <returns></returns>
        public static string SetDataToHtmlTable(DataTable dataTable, string tableAttributes, params KeyValuePair<string, string>[] headers)
        {
            StringBuilder htmlTableBuilder = new StringBuilder();
            htmlTableBuilder.AppendFormat("<table {0}>", tableAttributes);

            htmlTableBuilder.Append("<tr>");
            for (int i = 0; i < headers.Count(); i++)
            {
                htmlTableBuilder.AppendFormat("<th>{0}</th>", headers[i].Value);
            }
            htmlTableBuilder.Append("</tr>");

            foreach (DataRow row in dataTable.Rows)
            {
                htmlTableBuilder.Append("<tr>");
                for (int i = 0; i < headers.Count(); i++)
                {
                    htmlTableBuilder.AppendFormat("<td>{0}</td>", row[headers[i].Key]);
                }
                htmlTableBuilder.Append("</tr>");
            }

            htmlTableBuilder.Append("</table>");

            return htmlTableBuilder.ToString();
        }

    }

    public class KeyValueList<TKey, TValue> : List<KeyValuePair<TKey, TValue>>
    {
        public void Add(TKey key, TValue value)
        {
            base.Add(new KeyValuePair<TKey, TValue>(key, value));
        }
    }
}

호출 방법은 다음과 같습니다.
// 
DataTable resultTable = ExcelHelper.GetTableFromExcel(saveFilePath, fileExt, "data", 10);

// ( MVC ,WEBFORM )
KeyValueList<string, string> headers = new KeyValueList<string, string>() { 
                        {"year","   "},
                        {"month","   "},
                        {"stage1count","   "},
                        {"stage2count","   "},
                        {"stage3count","   "},
                        {"stage4count","   "},
                        {"yearincount"," "},
                        {"stagetotalcount"," "},
                        {"stage1rate"," "},
                        {"stage2rate"," "},
                        {"stage3rate"," "},
                        {"stage4rate"," "}
                };

                string tableAttributes = "border='1' cellspacing='3' cellpadding='3'";

                string htmlTable=ExcelHelper.SetDataToHtmlTable(model, tableAttributes, headers.ToArray());
                byte[] b = System.Text.Encoding.UTF8.GetBytes(htmlTable);

                return File(b, "application/vnd.ms-excel", string.Format("StageSummary_{0}_{1}_{2}.xls",orgcode,startym,endym));

그 중에서: KeyValueList는 제가 만든 집합 클래스입니다. 주로 헤더를 생성하는 데 사용되고 헤더가 데이터 열에 대응하는 데 사용됩니다. 클래스를 작성하는 이유는 List>를 직접 사용하면 집합 초기화기를 직접 사용할 수 없기 때문에 하나하나의 추가 대상이 필요합니다. 좀 번거롭습니다. ADD 방법이 추가되면 바로 사용할 수 있습니다: new KeyValueList() {","},...}편리하다. 어떤 사람들은 왜 SortedDictionary 등 기존의 정렬 종류를 사용하지 않느냐고 말할 수 있다. 왜냐하면 SortedDictionary는 키 정렬을 바탕으로 하고 여기는 ADD의 선후 순서로 정렬하기 때문이다.
더 많은 IT 관련 정보와 기술 기사, 저의 개인 사이트에 오신 것을 환영합니다:http://www.zuowenjun.cn/

좋은 웹페이지 즐겨찾기