C#用Infragistics 導入導出Excel(一)


最近項目中有數據的導入導出Excel的需求,這里做簡單整理。

公司用的是Infragistics的產品,付費,不需要本地安裝Office。

有需要的朋友可以下載 Infragistics.2013.2.2098,提取密碼:5u17

本文完整代碼下載 Demo.Excel.zip

當然,我知道還有其他開源的類庫來操作Excel,希望有資源的博友可以一起共享一下。

Infragistics安裝使用

直接安裝Infragistics_WinForms_20132.msi后再項目Reference中引用既可。操作Excel的話引用Infragistics4.Documents.Excel.v13.2.dll足矣。

導出Excel

支持的格式

  • Excel97To2003
  • Excel97To2003Template
  • Excel2007
  • Excel2007MacroEnabled
  • Excel2007MacroEnabledTemplate
  • Excel2007Template
  • StrictOpenXml

如果用JustCompile查看源碼,在不設置任何格式的情況下,默認是保存成Excel 97-2003 Workbook (*.xls)格式的,所以想要導出其他格式的Excel,需要調用SetCurrentFormat(WorkbookFormat format)方法。

使用SaveFileDialog,設置Filter,根據文件的后綴名映射Format。

	public Format GetFormat(string sExtension)
	{
	    switch (sExtension)
	    {
	        case ".xls":
	            return Format.Excel97To2003;
	        case ".xlt":
	            return Format.Excel97To2003Template;
	        case ".xlsx":
	            return Format.Excel2007;
	        case ".xltx":
	            return Format.Excel2007Template;
	        case ".xlsm":
	            return Format.Excel2007MacroEnabled;
	        case ".xltm":
	            return Format.Excel2007MacroEnabledTemplate;
	        default:
	            return Format.Excel97To2003;
	    }
	} 

創建Worksheet

定義數據類型

定義Attribute

  • DisplayNameAttribute: 顯示Excel的Header
  • WorksheetHeaderAttribute: 定義Header的背景色和前景色

用泛型來填充Worksheet

反射獲取屬性值

	public bool CreateSheet<T>(string sSheetName, List<T> lstRowData, bool bCreateHeader)
	{
	    ExcelProcessEvent("CreateSheet Start, sSheetName - " + sSheetName + ", lstRowData.Count - " + lstRowData.Count + ", bCreateHeader - " + bCreateHeader);
	    try
	    {
	        Worksheet aWorksheet = _Workbook.Worksheets.Add(sSheetName);

	        Type aType = typeof(T);
	        if(bCreateHeader) setSheetHeader(aWorksheet, aType);
	        int rowIndex = bCreateHeader ? 1 : 0;
	        foreach (var rowdata in lstRowData) {
	            for (int i = 0; i < aType.GetProperties().Length; i++)
	            {
	                var prop = aType.GetProperties()[i];
	                aWorksheet.Rows[rowIndex].Cells[i].Value = prop.GetValue(rowdata);
	                //ExcelProcessEvent("CreateSheet InProgress, " + rowIndex + " - " + prop.Name + ": " + prop.GetValue(rowdata).ToString());
	            }
	            rowIndex++;
	        }
	        ExcelProcessEvent("CreateSheet End, Success");
	        return true;
	    }
	    catch(Exception ex)
	    {
	        ExcelErrorEvent("CreateSheet Failed, Error - " + ex.Message);
	        return false;
	    }          
	}

	private void setSheetHeader(Worksheet oWorksheet, Type oType) {
	    ExcelProcessEvent("setSheetHeader Start");
	    for (int i = 0; i < oType.GetProperties().Length; i++)
	    {
	        var prop = oType.GetProperties()[i];
	        string displayName = prop.Name;
	        try
	        {
	            var customAttr = prop.GetCustomAttribute<DisplayNameAttribute>();
	            displayName = customAttr.DisplayName;                    
	        }
	        catch
	        {

	        }
	        ExcelProcessEvent("setSheetHeader InProgress, displayName - " + displayName);
	        Color backgroundcolor = Color.White;
	        Color forecolor = Color.Black;
	        try
	        {
	            var customAttr = prop.GetCustomAttribute<WorksheetHeaderAttribute>();
	            backgroundcolor = ColorTranslator.FromHtml(customAttr.BackgroundColor);
	            forecolor = ColorTranslator.FromHtml(customAttr.ForeColor);
	        }
	        catch
	        {

	        }
	        ExcelProcessEvent("setSheetHeader InProgress, backgroundcolor - " + backgroundcolor + ", forecolor - " + forecolor);
	        oWorksheet.Rows[0].Cells[i].Value = displayName;
	        oWorksheet.Rows[0].Cells[i].CellFormat.Fill = CellFill.CreateSolidFill(backgroundcolor);
	        oWorksheet.Rows[0].Cells[i].CellFormat.Font.ColorInfo = new WorkbookColorInfo(forecolor);
	    }
	    ExcelProcessEvent("setSheetHeader End");
	}

保存Workbook

保存成本地文件

保存成字節流(想着做成服務,提供Excel下載)

	public bool Save(string sFileName)
    {
        ExcelProcessEvent("Save Start, sFileName - " + sFileName);
        WorkbookFormat? format = Workbook.GetWorkbookFormat(sFileName);
        if (!format.HasValue)
        {
            ExcelErrorEvent("Save Failed, Error - No matched Workbook format found");
            return false;
        }
        try
        {
            _Workbook.SetCurrentFormat(format.Value);
            if (_Workbook.Worksheets.Count <= 0) _Workbook.Worksheets.Add("Sheet1");
            _Workbook.Save(sFileName);
            ExcelProcessEvent("Save End, Success");
            return true;
        }
        catch (Exception ex)
        {
            ExcelErrorEvent("Save Failed, Error - " + ex.Message);
            return false;
        }
    }

    public bool Save(out byte[] fileBytes, Format eFormat = Format.Excel97To2003)
    {
        ExcelProcessEvent("Save Start");
        fileBytes = new byte[0];
        WorkbookFormat? format = formatMap(eFormat);
        if (!format.HasValue)
        {
            ExcelErrorEvent("Save Failed, Error - No matched Workbook format found");
            return false;
        }
        try
        {
            using (MemoryStream ms = new MemoryStream())
            {
                _Workbook.SetCurrentFormat(format.Value);
                if (_Workbook.Worksheets.Count <= 0) _Workbook.Worksheets.Add("Sheet1");
                _Workbook.Save(ms);
                ms.Seek(0, SeekOrigin.Begin);
                fileBytes = new byte[(int)ms.Length];
                ms.Read(fileBytes, 0, fileBytes.Length);
                ExcelProcessEvent("Save End, Success");
                return true;
            }
        }
        catch (Exception ex)
        {
            ExcelErrorEvent("Save Failed, Error - " + ex.Message);
            return false;
        }
    }

導入Excel

加載文件

    public bool Load(string sFileName)
    {
        ExcelProcessEvent("Load Start, sFileName - " + sFileName);
        try
        {
            _Workbook = Workbook.Load(sFileName);
            ExcelProcessEvent("Load End, Success");
            return true;
        }
        catch (Exception ex)
        {
            ExcelErrorEvent("Load Failed, Error - " + ex.Message);
            return false;
        }
    }

解析Worksheet

泛型更通用

反射動態創建類實例

	public List<T> ReadSheet<T>(string sSheetName)
	{
	    ExcelProcessEvent("ReadSheet Start, sSheetName - " + sSheetName);
	    List<T> lst = new List<T>();
	    Worksheet aWorksheet = null;
	    try
	    {
	        aWorksheet = _Workbook.Worksheets[sSheetName];
	        if (aWorksheet == null)
	        {
	            ExcelProcessEvent("ReadSheet Failed, Error - No Worksheet found");
	            return lst;
	        }
	        var lstHeaders = aWorksheet.Rows[0].Cells.Select(o => o.Value.ToString()).ToList();

	        Type rowdataType = typeof(T);
	        List<KeyValuePair<string, int>> lstHeadersOrder = new List<KeyValuePair<string, int>>();

	        for (int i = 1; i < aWorksheet.Rows.Count(); i++)
	        {
	            var row = aWorksheet.Rows[i];
	            T obj = (T)Activator.CreateInstance(rowdataType);

	            foreach (var prop in rowdataType.GetProperties())
	            {
	                var displayNameAttr = prop.GetCustomAttribute<DisplayNameAttribute>();
	                string displayName = displayNameAttr.DisplayName;
	                int cellIndex = lstHeaders.IndexOf(displayName);

	                prop.SetValue(obj, row.Cells[cellIndex].Value);
	            }
	            lst.Add(obj);
	        }

	        return lst;
	    }
	    catch (Exception ex)
	    {
	        ExcelErrorEvent("ReadSheet Failed, Error - " + ex.Message);
	    }

	    return lst;
	}

客戶端調用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Windows.Media;
using Service.Excel;

namespace Demo.Excel.Client
{
    public class Book
    {
        [DisplayName("Book Number")]
        [WorksheetHeader("#006699", "#ffffff")]
        public string Id { get; set; }

        [DisplayName("Book Name")]
        [WorksheetHeader("#006699", "#ffffff")]
        public string Name { get; set; }

        [DisplayName("Price")]
        [WorksheetHeader("#006699", "#ffffff")]
        public string Price { get; set; }

        [DisplayName("Author Name")]
        [WorksheetHeader("#006699", "#ffffff")]
        public string Author { get; set; }

        [DisplayName("Book Description")]
        [WorksheetHeader("#006699", "#ffffff")]
        public string Description { get; set; }
    }
}

 

	private void test_SaveAs()
    {
        ExcelHelper oExcelHelper = new ExcelHelper();
        SaveFileDialog saveFileDialog = new SaveFileDialog();
        saveFileDialog.Filter = "Excel Workbook|*.xlsx|Excel Macro-Enabled Workbook|*.xlsm|Excel 97-2003 Workbook|*.xls|Excel Template|*.xltx|Excel Macro-Enabled Template|*.xltm|Excel 97-2003 Template|*.xlt|Static Open XML Spreadsheet|*.xlsx";
        saveFileDialog.FilterIndex = 1;
        saveFileDialog.AddExtension = true;
        saveFileDialog.FileName = "TestExcel." + DateTime.Now.ToString("yyyyMMddHHmmss");
        if (saveFileDialog.ShowDialog() == true)
        {
            List<Book> lstBook = new List<Book>();
            for (int i = 0; i < 2000; i++) {
                Book aBook = new Book();
                aBook.Id = i.ToString();
                aBook.Name = "Book - " + i.ToString();
                aBook.Price = i.ToString();
                aBook.Author = "Cad-Capture";
                aBook.Description = "This is a famous book around the world";

                lstBook.Add(aBook);
            }
            oExcelHelper.CreateSheet<Book>("Book", lstBook, true);
            byte[] fileBytes = new byte[0];
            if (oExcelHelper.Save(saveFileDialog.FileName))
            {

            }
        }
    }

    private void test_SaveAsBinary()
    {
        ExcelHelper oExcelHelper = new ExcelHelper();
        SaveFileDialog saveFileDialog = new SaveFileDialog();
        saveFileDialog.Filter = "Excel Workbook|*.xlsx|Excel Macro-Enabled Workbook|*.xlsm|Excel 97-2003 Workbook|*.xls|Excel Template|*.xltx|Excel Macro-Enabled Template|*.xltm|Excel 97-2003 Template|*.xlt|Static Open XML Spreadsheet|*.xlsx";
        saveFileDialog.FilterIndex = 1;
        saveFileDialog.AddExtension = true;
        saveFileDialog.FileName = "TestExcel." + DateTime.Now.ToString("yyyyMMddHHmmss");
        if (saveFileDialog.ShowDialog() == true)
        {

            byte[] fileBytes = new byte[0];
            if (oExcelHelper.Save(out fileBytes, oExcelHelper.GetFormat(System.IO.Path.GetExtension(saveFileDialog.SafeFileName))))
            {
                try
                {
                    using (FileStream fileStream = File.OpenWrite(saveFileDialog.FileName))
                    {
                        fileStream.Write(fileBytes, 0, fileBytes.Length);
                    }                            
                }
                catch(Exception ex)
                {

                }

            }
        }                
    }

    private void test_Load()
    {
        ExcelHelper oExcelHelper = new ExcelHelper();
        OpenFileDialog openFileDialog = new OpenFileDialog();
        openFileDialog.Filter = "Excel Workbook|*.xlsx|Excel Macro-Enabled Workbook|*.xlsm|Excel 97-2003 Workbook|*.xls|Excel Template|*.xltx|Excel Macro-Enabled Template|*.xltm|Excel 97-2003 Template|*.xlt|Static Open XML Spreadsheet|*.xlsx";
        openFileDialog.FilterIndex = 1;
        openFileDialog.AddExtension = true;

        if (openFileDialog.ShowDialog() == true)
        {
            List<Book> lstBook = new List<Book>();
            if (oExcelHelper.Load(openFileDialog.FileName)) {
                lstBook = oExcelHelper.ReadSheet<Book>("Book");
            }
            int count = lstBook.Count;
        }            
    }

小結

本文只是簡單的數據封裝然后導入導出,用了下泛型、反射、數據流、自定義特性,下一篇會搞一搞簡單的Excel樣式,Excel下載。

另外如何讓ExcelHelper類更加的一勞永逸,各位博友有什么更好地想法,歡迎分享。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM