[C#] Spire.Xls 導(dǎo)入導(dǎo)出功能

Spire.Xls我就不多介紹了, 百度一搜一堆, 我這里主要實(shí)現(xiàn)的是功能

程序需要引入 Spire.Xls DLL和其他相關(guān)幾個(gè)DLL

    /// <summary>
    /// Excel幫助類
    /// </summary>
    public class ExcelHelpers
    {
        #region 導(dǎo)入
        /// <summary>
        /// 將Excel以文件流轉(zhuǎn)換DataTable
        /// </summary>
        /// <param name="hasTitle">是否有表頭</param>
        /// <param name="path">文件路徑</param>
        /// <param name="tableindex">文件簿索引</param>
        public static DataTable ExcelToDataTableFormPath(bool hasTitle = true, string path = "", int tableindex = 0)
        {
            //新建Workbook
            Workbook workbook = new Workbook();
            //將當(dāng)前路徑下的文件內(nèi)容讀取到workbook對(duì)象里面
            workbook.LoadFromFile(path);
            //得到第一個(gè)Sheet頁
            Worksheet sheet = workbook.Worksheets[tableindex];
            return SheetToDataTable(hasTitle, sheet);
        }
        /// <summary>
        /// 將Excel以文件流轉(zhuǎn)換DataTable
        /// </summary>
        /// <param name="hasTitle">是否有表頭</param>
        /// <param name="stream">文件流</param>
        /// <param name="tableindex">文件簿索引</param>
        public static DataTable ExcelToDataTableFormStream(bool hasTitle = true, Stream stream = null,int tableindex = 0)
        {
            //新建Workbook
            Workbook workbook = new Workbook();
            //將文件流內(nèi)容讀取到workbook對(duì)象里面
            workbook.LoadFromStream(stream);
            //得到第一個(gè)Sheet頁
            Worksheet sheet = workbook.Worksheets[tableindex];

            int iRowCount = sheet.Rows.Length;
            int iColCount = sheet.Columns.Length;
            DataTable dt = new DataTable();
            //生成列頭
            for (int i = 0; i < iColCount; i++)
            {
                var name = "column" + i;
                if (hasTitle)
                {
                    var txt = sheet.Range[1, i + 1].Text;
                    if (!string.IsNullOrEmpty(txt)) name = txt;
                }
                while (dt.Columns.Contains(name)) name = name + "_1";//重復(fù)行名稱會(huì)報(bào)錯(cuò)。
                dt.Columns.Add(new DataColumn(name, typeof(string)));
            }
            //生成行數(shù)據(jù)
            int rowIdx = hasTitle ? 2 : 1;
            for (int iRow = rowIdx; iRow <= iRowCount; iRow++)
            {
                DataRow dr = dt.NewRow();
                for (int iCol = 1; iCol <= iColCount; iCol++)
                {
                    dr[iCol - 1] = sheet.Range[iRow, iCol].Text;
                }
                dt.Rows.Add(dr);
            }
            return SheetToDataTable(hasTitle,sheet);
        }

        private static DataTable SheetToDataTable(bool hasTitle,Worksheet sheet)
        {
            int iRowCount = sheet.Rows.Length;
            int iColCount = sheet.Columns.Length;
            var dt = new DataTable();
            //生成列頭
            for (var i = 0; i < iColCount; i++)
            {
                var name = "column" + i;
                if (hasTitle)
                {
                    var txt = sheet.Range[1, i + 1].Text;
                    if (!string.IsNullOrEmpty(txt)) name = txt;
                }
                while (dt.Columns.Contains(name)) name = name + "_1";//重復(fù)行名稱會(huì)報(bào)錯(cuò)。
                dt.Columns.Add(new DataColumn(name, typeof(string)));
            }
            //生成行數(shù)據(jù)
            // ReSharper disable once SuggestVarOrType_BuiltInTypes
            var rowIdx = hasTitle ? 2 : 1;
            for (var iRow = rowIdx; iRow <= iRowCount; iRow++)
            {
                var dr = dt.NewRow();
                for (var iCol = 1; iCol <= iColCount; iCol++)
                {
                    dr[iCol - 1] = sheet.Range[iRow, iCol].Text;
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }
        #endregion

        #region 導(dǎo)出
        /// <summary>
        /// 將DaTaTable轉(zhuǎn)成byte[]類型
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="hasTitle">是否有表頭</param>
        /// <returns></returns>
        public static byte[] GetDataTableToByte(DataTable dt,bool hasTitle)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                Workbook workbook = new Workbook();
                Worksheet sheet = workbook.Worksheets[0];//第一個(gè)工作簿
                if (hasTitle) //表頭
                {
                    for (var j = 0; j < dt.Columns.Count; j++)
                    {
                        sheet.Range[1, j + 1].Text = dt.Columns[j].ColumnName;
                        sheet.Range[1, j + 1].ColumnWidth = 22;
                        sheet.Range[1, j + 1].Style.Borders[BordersLineType.EdgeLeft].LineStyle = LineStyleType.Thin;//邊框
                        sheet.Range[1, j + 1].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin;//邊框
                        sheet.Range[1, j + 1].Style.Borders[BordersLineType.EdgeTop].LineStyle = LineStyleType.Thin;//邊框
                        sheet.Range[1, j + 1].Style.Borders[BordersLineType.EdgeBottom].LineStyle = LineStyleType.Thin;//邊框
                    }
                }
                
                //循環(huán)表數(shù)據(jù)
                for (var i = 0; i < dt.Rows.Count; i++)//循環(huán)賦值
                {
                    for (var j = 0; j < dt.Columns.Count; j++)
                    {
                        var dyg = sheet.Range[i + 2, j + 1];
                        dyg.Text = dt.Rows[i][j].ToString();
                        dyg.ColumnWidth = 22;
                        dyg.Style.Borders[BordersLineType.EdgeLeft].LineStyle = LineStyleType.Thin;//邊框
                        dyg.Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin;
                        dyg.Style.Borders[BordersLineType.EdgeTop].LineStyle = LineStyleType.Thin;
                        dyg.Style.Borders[BordersLineType.EdgeBottom].LineStyle = LineStyleType.Thin;
                    }
                }
                workbook.SaveToStream(ms, FileFormat.Version2007);
                byte[] data = ms.ToArray();
                return data;
            }
        }
        #endregion
    }

更多導(dǎo)出樣式請(qǐng)看:
http://www.cnblogs.com/landeanfen/p/5888973.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,922評(píng)論 25 709
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,176評(píng)論 4 61
  • 轉(zhuǎn)自鏈接 目錄 1.認(rèn)識(shí)NPOI 2.使用NPOI生成xls文件 2.1創(chuàng)建基本內(nèi)容 2.1.1創(chuàng)建Workboo...
    腿毛褲閱讀 11,143評(píng)論 1 3
  • 近一兩年看到有網(wǎng)友曬出一些小時(shí)候的老照片,這些照片的背景里卻有如今的伴侶,而小時(shí)候兩個(gè)人完全不認(rèn)識(shí),長(zhǎng)大后彼此遇見...
    風(fēng)鈴草的吟唱閱讀 899評(píng)論 0 1
  • 先放一張圖片 明明sdk location里的配置都是對(duì)的,這個(gè)錯(cuò)誤往往發(fā)生在多人協(xié)同開發(fā)或者多臺(tái)不同的電腦設(shè)備開...
    stone呀閱讀 1,764評(píng)論 0 0

友情鏈接更多精彩內(nèi)容