不安装office的情况下如何实现对excel的导入导出

摘要:
答:方法一、对于07/10及以后的版本,可以采用openxmlsdk,因为07/10都是openxml标准的,利用openxmlsdk可以不用安装office而对office文件进行操作。若03不安装office,可以使用NPOI。可以考虑将数据发送到服务端,从服务端生成excel文件,然后再传输会客户端。这样客户端就不需要安装任何office软件了,只要在服务端安装就可以了。这种格式的文件不论在程序中还是在Excel中都可以很好地支持。excel可以保存为或打开这种格式。

答:

方法一、对于07/10及以后的版本,可以采用openxml sdk,因为07/10都是open xml标准的,利用open xml sdk可以不用安装office而对office文件进行操作。而且速度快。

若03不安装office,可以使用NPOI 。

可以考虑将数据发送到服务端,从服务端生成excel文件,然后再传输会客户端。这样客户端就不需要安装任何office软件了,只要在服务端安装就可以了。

方法二、导出为文本格式,每条记录占一行,每列使用制表符分隔。这种格式的文件不论在程序中还是在Excel中都可以很好地支持。excel可以保存为或打开这种格式。

方法三、pengzhiq的专栏http://blog.csdn.net/pengzhiq/article/details/6004365)说的两种方式,

第一种方式:写 xml 比较简单dataset.WriteXml(strXMLFileName, System.Data.XmlWriteMode.WriteSchema);

代码摘自心中有你http://hi.baidu.com/sbiweeq/item/75b16e4fe85a270cc01613be)的《c# 导出Excel Xml格式 不用安装Excel也不用引入任何组件》,

public static void CreateExcel(string filepath, int roms, int troms, int zroms, stringstrdate, Model.Form8 form8)
    {
        if (filepath != "")
        {
            StreamWriter rw = new StreamWriter(filepath, false, Encoding.GetEncoding("UTF-8"), 10240);
            rw.WriteLine("<?xml version="1.0"?>");
            rw.WriteLine("<?mso-application progid="Excel.Sheet"?>");
            rw.WriteLine("<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">");
            rw.WriteLine("<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">");
            rw.WriteLine("<Created>1996-12-17T01:32:42Z</Created>");
            rw.WriteLine("<LastSaved>2000-11-18T06:53:49Z</LastSaved>");
            rw.WriteLine("<Version>11.8107</Version>");
            rw.WriteLine("</DocumentProperties>");
            rw.WriteLine("<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">");
            rw.WriteLine("<RemovePersonalInformation/>");
            rw.WriteLine("</OfficeDocumentSettings>");
            rw.WriteLine("<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">");
            rw.WriteLine("<WindowHeight>4530</WindowHeight>");
            rw.WriteLine("<WindowWidth>8505</WindowWidth>");
            rw.WriteLine("<WindowTopX>480</WindowTopX>");
            rw.WriteLine("<WindowTopY>120</WindowTopY>");
            rw.WriteLine("<AcceptLabelsInFormulas/>");
            rw.WriteLine("<ProtectStructure>False</ProtectStructure>");
            rw.WriteLine("<ProtectWindows>False</ProtectWindows>");
            rw.WriteLine("</ExcelWorkbook>");
            rw.WriteLine("<Styles>");
            rw.WriteLine("<Style ss:  ss:Name="Normal">");
            rw.WriteLine("<Alignment ss:Vertical="Bottom"/>");
            rw.WriteLine("<Borders/>");
            rw.WriteLine("<Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>");
            rw.WriteLine("<Interior/>");
            rw.WriteLine("<NumberFormat/>");
            rw.WriteLine("<Protection/>");
            rw.WriteLine("</Style>");
            rw.WriteLine("<Style ss:ID="s24">");
            rw.WriteLine("<Font ss:FontName="宋体" x:CharSet="134" ss:Size="9"/>");
            rw.WriteLine("<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>");
            rw.WriteLine("<Borders>");
            rw.WriteLine("<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>");
            rw.WriteLine("<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>");
            rw.WriteLine("<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>");
            rw.WriteLine("<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>");
            rw.WriteLine("</Borders>");
            rw.WriteLine("<NumberFormat ss:Format="@"/>");
            rw.WriteLine("</Style>");
            rw.WriteLine("<Style ss:ID="s25">");
            rw.WriteLine("<Font ss:FontName="宋体" x:CharSet="134" ss:Size="9"/>");
            rw.WriteLine("<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>");
            rw.WriteLine("<Borders>");
            rw.WriteLine("<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>");
            rw.WriteLine("<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>");
            rw.WriteLine("<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>");
            rw.WriteLine("<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>");
            rw.WriteLine("</Borders>");
            rw.WriteLine("</Style>");
            rw.WriteLine("<Style ss:ID="s26">");
            rw.WriteLine("<Font ss:FontName="宋体" x:CharSet="134" ss:Size="9"/>");
            rw.WriteLine("<Alignment ss:Horizontal="Right" ss:Vertical="Bottom"/>");
            rw.WriteLine("</Style>");
            rw.WriteLine("<Style ss:ID="s27">");
            rw.WriteLine("<Font ss:FontName="宋体" x:CharSet="134" ss:Size="9"/>");
            rw.WriteLine("<Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>");
            rw.WriteLine("</Style>");
            rw.WriteLine("<Style ss:ID="m24861836">");
            rw.WriteLine("<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>");
            rw.WriteLine("<Borders/>");
            rw.WriteLine("<Font ss:FontName="宋体" x:CharSet="134" ss:Size="20" ss:Bold="1"/>");
            rw.WriteLine("<NumberFormat/>");
            rw.WriteLine("<Protection ss:Protected="0"/>");
            rw.WriteLine("</Style>");            
            rw.WriteLine("<Style ss:ID="s28">");
            rw.WriteLine("<Font ss:FontName="宋体" x:CharSet="134" ss:Size="9"/>");
            rw.WriteLine("<Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>");
            rw.WriteLine("<NumberFormat ss:Format="@"/>");
            rw.WriteLine("</Style>");
            rw.WriteLine("</Styles>");
            //sheet
            rw.WriteLine("<Worksheet ss:Name="Sheet1">");
            rw.WriteLine("<Table x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="75" ss:DefaultRowHeight="14.25">");

            if (strdate != null)
            {
                string[] str = strdate.Split('');
                int cou = 1;
                //设置表头
                rw.WriteLine("<Row ss:Height="31.5">");
                rw.WriteLine("<Cell ss:MergeAcross="7" ss:StyleID="m24861836"><Data ss:Type="String">123123</Data></Cell>");
                rw.WriteLine("</Row>");

                rw.WriteLine("<Row>");
                rw.WriteLine("<Cell ss:StyleID="s26"><Data ss:Type="String">123123</Data></Cell>");
                rw.WriteLine("<Cell ss:StyleID="s27"/>");
                rw.WriteLine("<Cell ss:StyleID="s26"><Data ss:Type="String">123</Data></Cell>");
                rw.WriteLine("<Cell ss:MergeAcross="2" ss:StyleID="s27"><Data ss:Type="String">asdasd</Data></Cell>");
                rw.WriteLine("<Cell ss:StyleID="s26"><Data ss:Type="String">123123</Data></Cell>");
                rw.WriteLine("<Cell ss:StyleID="s28"><Data ss:Type="Number">123</Data></Cell>");
                rw.WriteLine("</Row>");
                rw.WriteLine("<Row>");
                rw.WriteLine("<Cell ss:MergeAcross="1" ss:StyleID="s25"><Data ss:Type="String">q123</Data></Cell>");
                rw.WriteLine("<Cell ss:StyleID="s25"><Data ss:Type="String">123</Data></Cell>");
                rw.WriteLine("<Cell ss:StyleID="s25"><Data ss:Type="String">123</Data></Cell>");
                rw.WriteLine("<Cell ss:StyleID="s25"><Data ss:Type="String">123</Data></Cell>");
                rw.WriteLine("<Cell ss:StyleID="s25"><Data ss:Type="String">123</Data></Cell>");
                rw.WriteLine("<Cell ss:StyleID="s25"><Data ss:Type="String">123</Data></Cell>");
                rw.WriteLine("<Cell ss:StyleID="s25"><Data ss:Type="String">123</Data></Cell>");
                rw.WriteLine("</Row>");

                for (int i = 0; i < roms; i++)
                {
                    rw.WriteLine("<Row>");
                    for (int j = 0; j < 8; j++)
                    {
                        if (j == 0)
                        {
                            if (i <troms)
                            {
                                rw.WriteLine("<Cell ss:StyleID="s25"><Data ss:Type="String">123</Data></Cell>");
                            }
                            if (i >= troms && i < (troms +zroms))
                            {
                                rw.WriteLine("<Cell ss:StyleID="s25"><Data ss:Type="String">123</Data></Cell>");
                            }
                        }
                        else{
                            if (i < (troms +zroms))
                            {
                                try{

                                    if(isNum(str[cou]))
                                    {
                                        rw.WriteLine("<Cell ss:StyleID="s24"><Data ss:Type="Number">" + str[cou] + "</Data></Cell>");
                                    }
                                    else{
                                        rw.WriteLine("<Cell ss:StyleID="s25"><Data ss:Type="String">" + str[cou] + "</Data></Cell>");
                                    }
                                    cou++;
                                }
                                catch(Exception ex) { }
                            }
                        }
                    }
                    rw.WriteLine("</Row>");
                }
            }
            //设置表尾
            rw.WriteLine("<Row>");
            rw.WriteLine("<Cell/>");
            rw.WriteLine("<Cell ss:StyleID="s26"><Data ss:Type="String">123:</Data></Cell>");
            rw.WriteLine("<Cell ss:StyleID="s27"><Data ss:Type="String">" + form8.P302 + "</Data></Cell>");
            rw.WriteLine("<Cell ss:StyleID="s26"><Data ss:Type="String">123:</Data></Cell>");
            rw.WriteLine("<Cell ss:StyleID="s27"><Data ss:Type="String">" + form8.P303 + "</Data></Cell>");
            rw.WriteLine("<Cell ss:StyleID="s26"><Data ss:Type="String">123:</Data></Cell>");
            rw.WriteLine("<Cell ss:StyleID="s27"><Data ss:Type="String">" + form8.P304 + "</Data></Cell>");
            rw.WriteLine("</Row>");

            rw.WriteLine("</Table>");
            rw.WriteLine("<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">");
            rw.WriteLine("<Selected/>");
            rw.WriteLine("<ProtectObjects>False</ProtectObjects>");
            rw.WriteLine("<ProtectScenarios>False</ProtectScenarios>");
            rw.WriteLine("</WorksheetOptions>");
            rw.WriteLine("</Worksheet>");

            rw.WriteLine("<Worksheet ss:Name="Sheet2">");
            rw.WriteLine("<Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"/>");
            rw.WriteLine("<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">");
            rw.WriteLine("<Selected/>");
            rw.WriteLine("<ProtectObjects>False</ProtectObjects>");
            rw.WriteLine("<ProtectScenarios>False</ProtectScenarios>");
            rw.WriteLine("</WorksheetOptions>");
            rw.WriteLine("</Worksheet>");

            rw.WriteLine("<Worksheet ss:Name="Sheet3">");
            rw.WriteLine("<Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"/>");
            rw.WriteLine("<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">");
            rw.WriteLine("<Selected/>");
            rw.WriteLine("<ProtectObjects>False</ProtectObjects>");
            rw.WriteLine("<ProtectScenarios>False</ProtectScenarios>");
            rw.WriteLine("</WorksheetOptions>");
            rw.WriteLine("</Worksheet>");
            //sheet
            rw.WriteLine("</Workbook>");
            rw.Flush();
            rw.Close();
        }
    }
View Code

第二种方式:先得了解excel文件的文件流格式。

    public classExcelWriter
    {
        privateStream stream;
        privateBinaryWriter writer;

        private ushort[] clBegin = { 0x0809, 8, 0, 0x10, 0, 0};
        private ushort[] clEnd = { 0x0A, 00};


        private void WriteUshortArray(ushort[] value)
        {
            for (int i = 0; i < value.Length; i++)
                writer.Write(value[i]);
        }

        /// <summary>
        ///Initializes a new instance of the <see cref="ExcelWriter"/>class.
        /// </summary>
        /// <param name="stream">The stream.</param>
        publicExcelWriter(Stream stream)
        {
            this.stream =stream;
            writer = newBinaryWriter(stream);
        }

        /// <summary>
        ///Writes the text cell value.
        /// </summary>
        /// <param name="row">The row.</param>
        /// <param name="col">The col.</param>
        /// <param name="value">The string value.</param>
        public void WriteCell(int row, int col, stringvalue)
        {
            ushort[] clData = { 0x0204, 0, 0, 0, 0, 0};
            int iLen =value.Length;
            byte[] plainText =Encoding.ASCII.GetBytes(value);
            clData[1] = (ushort)(8 +iLen);
            clData[2] = (ushort)row;
            clData[3] = (ushort)col;
            clData[5] = (ushort)iLen;
            WriteUshortArray(clData);
            writer.Write(plainText);
        }

        /// <summary>
        ///Writes the integer cell value.
        /// </summary>
        /// <param name="row">The row number.</param>
        /// <param name="col">The column number.</param>
        /// <param name="value">The value.</param>
        public void WriteCell(int row, int col, intvalue)
        {
            ushort[] clData = { 0x027E, 10, 0, 0, 0};
            clData[2] = (ushort)row;
            clData[3] = (ushort)col;
            WriteUshortArray(clData);
            int iValue = (value << 2) | 2;
            writer.Write(iValue);
        }

        /// <summary>
        ///Writes the double cell value.
        /// </summary>
        /// <param name="row">The row number.</param>
        /// <param name="col">The column number.</param>
        /// <param name="value">The value.</param>
        public void WriteCell(int row, int col, doublevalue)
        {
            ushort[] clData = { 0x0203, 14, 0, 0, 0};
            clData[2] = (ushort)row;
            clData[3] = (ushort)col;
            WriteUshortArray(clData);
            writer.Write(value);
        }

        /// <summary>
        ///Writes the empty cell.
        /// </summary>
        /// <param name="row">The row number.</param>
        /// <param name="col">The column number.</param>
        public void WriteCell(int row, intcol)
        {
            ushort[] clData = { 0x0201, 6, 0, 0, 0x17};
            clData[2] = (ushort)row;
            clData[3] = (ushort)col;
            WriteUshortArray(clData);
        }

        /// <summary>
        ///Must be called once for creating XLS file header
        /// </summary>
        public voidBeginWrite()
        {
            WriteUshortArray(clBegin);
        }

        /// <summary>
        ///Ends the writing operation, but do not close the stream
        /// </summary>
        public voidEndWrite()
        {
            WriteUshortArray(clEnd);
            writer.Flush();
        }
    }
View Code

由上面可以知道读取excel同理,去掉开头和结尾

方法四、

#region DateGridView导出到csv格式的Excel
/// <summary>
///常用方法,列之间加	,一行一行输出,此文件其实是csv文件,不过默认可以当成Excel打开。
/// </summary>
/// <remarks>
///using System.IO;
/// </remarks>
/// <param name="dgv"></param>
private voidDataGridViewToExcel(DataGridView dgv)
{
    SaveFileDialog dlg = newSaveFileDialog();
    dlg.Filter = "Execl files (*.xls)|*.xls";
    dlg.FilterIndex = 0;
    dlg.RestoreDirectory = true;
    dlg.CreatePrompt = true;
    dlg.Title = "保存为Excel文件";

    if (dlg.ShowDialog() ==DialogResult.OK)
    {
        Stream myStream;
        myStream =dlg.OpenFile();
        StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));
        string columnTitle = "";
        try{
            //写入列标题
            for (int i = 0; i < dgv.ColumnCount; i++)
            {
                if (i > 0)
                {
                    columnTitle += "";
                }
                columnTitle +=dgv.Columns[i].HeaderText;
            }
            sw.WriteLine(columnTitle);

            //写入列内容
            for (int j = 0; j < dgv.Rows.Count; j++)
            {
                string columnValue = "";
                for (int k = 0; k < dgv.Columns.Count; k++)
                {
                    if (k > 0)
                    {
                        columnValue += "";
                    }
                    if (dgv.Rows[j].Cells[k].Value == null)
                        columnValue += "";
                    elsecolumnValue +=dgv.Rows[j].Cells[k].Value.ToString().Trim();
                }
                sw.WriteLine(columnValue);
            }
            sw.Close();
            myStream.Close();
        }
        catch(Exception e)
        {
            MessageBox.Show(e.ToString());
        }
        finally{
            sw.Close();
            myStream.Close();
        }
    }
} 
#endregion
View Code

方法五、只要有Word/Excel的相关Com的DLL,就可实现操作导入导出操作,但不能打开.
Excel: Excel.dll、 office.dll、 vbide.dll
word: word.dll、 office.dll、 vbide.dll

方法六、还是要安装Office了,但能检测是否安装了Office

#region DataGridView导出到Excel,有一定的判断性
        /// <summary> 
        ///方法,导出DataGridView中的数据到Excel文件 
        /// </summary> 
        /// <remarks>
        ///add com "Microsoft Excel 11.0 Object Library"
        ///using Excel=Microsoft.Office.Interop.Excel;
        ///using System.Reflection;
        /// </remarks>
        /// <param name= "dgv">DataGridView </param> 
        public static voidDataGridViewToExcel2(DataGridView dgv)
        {
            //用GetTypeFromProgID来获取是否安装了Office,比较可靠。
            //通过  class id  , prog id 来拿, 看结果测试是否安装才是王道 prog id 可信, clsid 不可信;
            //另外:
            //try
            //{
            //OfficeExcel.Application oExcel = oExcel = new OfficeExcel.Application();
            //}
            //catch
            //{
            //MessageBox.Show("本机没安装 Excel");

            //}
            //上面的验证方式也不好,就怕Excel.Application  app=new Excel.ApplicationClass();这句会抛出异常. 
            string projid1 = "Excel.Application";
            string projid2 = "Excel.Application.15";
            System.Type t1 =System.Type.GetTypeFromProgID(projid1);
            if (t1 != null)
                Console.WriteLine(t1.ToString());
            elseConsole.WriteLine("cannot get {0}", projid1);

            System.Type t2 =System.Type.GetTypeFromProgID(projid2);
            if (t2 != null)
            {

            }
            else{
                MessageBox.Show("The office have not installed!Please install office first!");
                return;
            }


            #region   验证可操作性SaveFileDialog dlg = newSaveFileDialog();
            dlg.DefaultExt = "xls ";
            dlg.Filter = "EXCEL文件(*.XLS)|*.xls ";
            dlg.InitialDirectory =Directory.GetCurrentDirectory();

            if (dlg.ShowDialog() ==DialogResult.Cancel)
            {
                return;
            }
            string fileNameString =dlg.FileName;
            if (fileNameString.Trim() == " ")
            {
                return;
            }
            //定义表格内数据的行数和列数 
            int rowscount =dgv.Rows.Count;
            int colscount =dgv.Columns.Count;

            //行数必须大于0 
            if (rowscount <= 0)
            {
                MessageBox.Show("没有数据可供保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            //列数必须大于0 
            if (colscount <= 0)
            {
                MessageBox.Show("没有数据可供保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            //行数不可以大于65536 
            if (rowscount > 65536)
            {
                MessageBox.Show("数据记录数太多(最多不能超过65536条),不能保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            //列数不可以大于255 
            if (colscount > 255)
            {
                MessageBox.Show("数据记录行数太多,不能保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            //验证以fileNameString命名的文件是否存在,如果存在删除它 
            FileInfo file = newFileInfo(fileNameString);
            if(file.Exists)
            {
                try{
                    file.Delete();
                }
                catch(Exception error)
                {
                    MessageBox.Show(error.Message, "删除失败 ", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
            }
            #endregion
            Excel.Application objExcel = null;
            Excel.Workbook objWorkbook = null;
            Excel.Worksheet objsheet = null;
            try{
                //申明对象 
                objExcel = newMicrosoft.Office.Interop.Excel.Application();
                objWorkbook =objExcel.Workbooks.Add(Missing.Value);
                objsheet =(Excel.Worksheet)objWorkbook.ActiveSheet;
                //设置EXCEL不可见 
                objExcel.Visible = false;

                //向Excel中写入表格的表头 
                int displayColumnsCount = 1;
                for (int i = 0; i <= dgv.ColumnCount - 1; i++)
                {
                    if (dgv.Columns[i].Visible == true)
                    {
                        objExcel.Cells[1, displayColumnsCount] =dgv.Columns[i].HeaderText.Trim();
                        displayColumnsCount++;
                    }
                }
                //向Excel中逐行逐列写入表格中的数据 
                for (int row = 0; row <= dgv.RowCount - 1; row++)
                {
                    displayColumnsCount = 1;
                    for (int col = 0; col < colscount; col++)
                    {
                        if (dgv.Columns[col].Visible == true)
                        {
                            try{
                                objExcel.Cells[row + 2, displayColumnsCount] =dgv.Rows[row].Cells[col].Value.ToString().Trim();
                                displayColumnsCount++;
                            }
                            catch(Exception)
                            {

                            }

                        }
                    }
                }
                //保存文件 
objWorkbook.SaveAs(fileNameString, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                        Missing.Value, Excel.XlSaveAsAccessMode.xlShared, Missing.Value, Missing.Value, Missing.Value,
                        Missing.Value, Missing.Value);
            }
            catch(Exception error)
            {
                MessageBox.Show(error.Message, "警告 ", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            finally{
                //关闭Excel应用
                if (objWorkbook != null) objWorkbook.Close(Missing.Value, Missing.Value, Missing.Value);
                if (objExcel.Workbooks != null) objExcel.Workbooks.Close();
                if (objExcel != null) objExcel.Quit();

                //objsheet = null;
                //objWorkbook = null;
                //objExcel = null;

                //释放资源
System.Runtime.InteropServices.Marshal.ReleaseComObject(objsheet);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(objWorkbook);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel);
                System.GC.Collect();//强制垃圾回收  
}
            MessageBox.Show(fileNameString + "
导出完毕! ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);

        }

        #endregion
View Code

方法七、ASP.NET的话还可以用下面的代码:

/*==============下载自笔锋侠==========================================
    文件名:ExcelXML.cs
    功能说明:按照Excel体系结构封装的基础类,包含工作簿类、工作表集合、工作表、行集合、行
    属性:普通类
    其他:
    创建者标识:笔锋侠 2010年02月03日 
    QQ:86994549
=====================================================================*/

usingSystem;
usingSystem.Web;
usingSystem.Collections;
usingSystem.Collections.Generic;
usingSystem.Text.RegularExpressions;


namespaceExportExcel
{
    /// <summary>
    ///单元格值类型(日期作为文本处理)
    /// </summary>
    public enumValueType
    {
        String = 0,
        Number = 1}

    /// <summary>
    ////// </summary>
    public classRow
    {
        private static string _patten = @"^d{1,15}$";
        private static Regex _regex = newRegex(_patten);
        private string[] _cellsValue;
        public string[] CellsValue
        {
            get { return_cellsValue; }
            set { _cellsValue =value; }
        }

        private string_rowText;
        public stringRowText
        {
            get { return_rowText; }
        }

        /// <summary>
        ///构造函数,生成一行
        /// </summary>
        /// <param name="values">各单元格值</param>
        /// <param name="isAutoType">是否自动设置值类型</param>
        public Row(string[] values, boolisAutoType)
        {
            if (values.Length > 256)
            {
                throw new Exception("Excel中不能超过256列!");
            }

            _cellsValue =values;

            _rowText = "<Row>
";
            foreach (string cell invalues)
            {
                ValueType vType =ValueType.String;
                if(isAutoType)
                {
                    if(_regex.Match(cell).Success)
                    {
                        vType =ValueType.Number;
                    }
                }
                _rowText += "<Cell><Data ss:Type="" + vType.ToString() + "">" + cell + "</Data></Cell>
";
            }
            _rowText += "</Row>
";
        }

        /// <summary>
        ///构造函数,生成一行
        /// </summary>
        /// <param name="values">各单元格值</param>
        /// <param name="valueTypes">各单元格值类型</param>
        public Row(string[] values, ValueType[] valueTypes)
        {
            if (values.Length > 256 || valueTypes.Length > 256)
            {
                throw new Exception("Excel中不能超过256列!");
            }

            _cellsValue =values;

            int i = 0;
            _rowText = "<Row>
";
            foreach (string cell invalues)
            {
                ValueType vType =ValueType.String;
                if (i<valueTypes.Length)
                {
                    vType =valueTypes[i];
                    if (vType ==ValueType.Number)
                    {
                        if (!_regex.Match(cell).Success)
                        {
                            vType =ValueType.String;
                        }
                    }
                }
                _rowText += "<Cell><Data ss:Type="" + vType.ToString() + "">" + cell + "</Data></Cell>
";

                i++;
            }
            _rowText += "</Row>
";
        }
    }

    /// <summary>
    ///行集合
    /// </summary>
    public class_rows : IEnumerable
    {
        private List<Row> _rowList = new List<Row>();
        private bool _isAutoType = true;
        public boolIsAutoType
        {
            get { return_isAutoType; }
            set { _isAutoType =value; }
        }

        privateValueType[] _valueTypes;
        publicValueType[] ValueTypes
        {
            get { return_valueTypes; }
            set { _valueTypes =value; }
        }

        /// <summary>
        ///已使用行数
        /// </summary>
        public intCount
        {
            get { return_rowList.Count; }
        }

        /// <summary>
        ///添加标题行
        /// </summary>
        /// <param name="cells"></param>
        /// <param name="valueTypes"></param>
        /// <returns></returns>
        public Row AddTitle(string[] cells)
        {
            Row row = new Row(cells, false);
            _rowList.Add(row);
            returnrow;
        }

        /// <summary>
        ///添加标题行并设置列格式
        /// </summary>
        /// <param name="cells"></param>
        /// <param name="valueTypes"></param>
        /// <returns></returns>
        public Row AddTitle(string[] cells, ValueType[] valueTypes)
        {
            this._valueTypes =valueTypes;
            Row row = new Row(cells, false);
            _rowList.Add(row);
            returnrow;
        }

        /// <summary>
        ///添加行
        /// </summary>
        /// <param name="cells"></param>
        public Row Add(string[] cells)
        {
            if (this.Count >= 65536)
            {
                throw new Exception("已经达到了Excel允许的最大行!");
            }

            if (_valueTypes == null)
            {
                Row row = newRow(cells, _isAutoType);
                _rowList.Add(row);
                returnrow;
            }
            else{
                Row row = newRow(cells, _valueTypes);
                _rowList.Add(row);
                returnrow;
            }
        }


        /// <summary>
        ///删除行
        /// </summary>
        /// <param name="index">行号</param>
        public void Delete(intindex)
        {
            if (index < 0 || index >= this.Count)
            {
                throw new Exception("下标超出范围!");
            }
            _rowList.RemoveAt(index);
        }

        /// <summary>
        ///获取行
        /// </summary>
        /// <param name="index">行号</param>
        /// <returns></returns>
        public Row this[intindex]
        {
            get{
                if (index<0 || index >= this.Count)
                {
                    throw new Exception("下标超出范围!");
                }
                return_rowList[index]; 
            }
        }

        /// <summary>
        ///遍历行
        /// </summary>
        /// <returns></returns>
        publicIEnumerator GetEnumerator()
        {
            return_rowList.GetEnumerator();
        }
    }

    /// <summary>
    ///工作表类
    /// </summary>
    public classSheet
    {
        private string_sheetName;
        public stringSheetName
        {
            get { return_sheetName; }
            set { _sheetName =value; }
        }

        private int _topRowBottomPane = 0;
        public intTopRowBottomPane
        {
            get { return_topRowBottomPane; }
        }

        private int _leftColumnRightPane = 0;
        public intLeftColumnRightPane
        {
            get { return_leftColumnRightPane; }
        }

        /// <summary>
        ///构造工作表
        /// </summary>
        /// <param name="sheetName">工作表名</param>
        public Sheet(stringsheetName)
        {
            this._sheetName =sheetName;
        }

        /// <summary>
        ///冻结窗格
        /// </summary>
        /// <param name="topRowBottomPane">冻结线上方行数</param>
        /// <param name="leftColumnRightPane">冻结线左边行数</param>
        public void Frozen(int topRowBottomPane, intleftColumnRightPane)
        {
            if (topRowBottomPane < 0 || topRowBottomPane >= 65536)
            {
                throw new Exception("索引超出范围!");
            }
            if (leftColumnRightPane < 0 || leftColumnRightPane >= 256)
            {
                throw new Exception("索引超出范围!");
            }

            this._topRowBottomPane =topRowBottomPane;
            this._leftColumnRightPane =leftColumnRightPane;
        }

        public _rows Rows = new_rows();
        
    }

    /// <summary>
    ///工作表集合
    /// </summary>
    public class_sheets: IEnumerable
    {
        private List<Sheet> _sheetList = new List<Sheet>();

        /// <summary>
        ///工作表数量
        /// </summary>
        public intCount
        {
            get { return_sheetList.Count; }
        }

        /// <summary>
        ///添加工作表
        /// </summary>
        /// <param name="sheetName">工作表名</param>
        /// <returns>工作表对象</returns>
        public Sheet Add(stringsheetName)
        {
            foreach (Sheet sht in_sheetList)
            {
                if (sht.SheetName ==sheetName)
                {
                    throw new Exception("同一工作簿中工作表名不能相同!");
                }
            }

            Sheet sheet = newSheet(sheetName);
            _sheetList.Add(sheet);
            returnsheet;
        }

        /// <summary>
        ///添加工作表
        /// </summary>
        /// <param name="sheet">工作表对象</param>
        /// <returns>工作表对象</returns>
        publicSheet Add(Sheet sheet)
        {
            foreach (Sheet sht in_sheetList)
            {
                if (sht.SheetName ==sheet.SheetName)
                {
                    throw new Exception("同一工作簿中工作表名不能相同!");
                }
            }

            _sheetList.Add(sheet);
            returnsheet;
        }

        /// <summary>
        ///删除工作表
        /// </summary>
        /// <param name="index">工作表索引</param>
        public void Delete(intindex)
        {
            if (index < 0 || index >= this.Count)
            {
                throw new Exception("下标超出范围!");
            }
            _sheetList.RemoveAt(index);
        }

        /// <summary>
        ///获取工作表
        /// </summary>
        /// <param name="index">工作表索引</param>
        /// <returns></returns>
        public Sheet this[intindex]
        {
            get{
                if (index < 0 || index >= this.Count)
                {
                    throw new Exception("下标超出范围!");
                }
                return_sheetList[index]; 
            }
        }

        /// <summary>
        ///遍历工作表
        /// </summary>
        /// <returns></returns>
        publicIEnumerator GetEnumerator()
        {
            return_sheetList.GetEnumerator();
        }
    }

    /// <summary>
    ///Excel XML工作簿类
    /// </summary>
    public classExcelXML
    {
        public _sheets Sheets = new_sheets();

        private static string _appHead = "<?xml version="1.0"?> 
<?mso-application progid="Excel.Sheet"?>
";
        private static string _workBookHead = "<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
  xmlns:o="urn:schemas-microsoft-com:office:office" 
  
xmlns:x="urn:schemas-microsoft-com:office:excel" 
  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
  xmlns:html="http://www.w3.org/TR/REC-html40"> 

";

        #region 冻结窗格

        /// <summary>
        ///设置工作表选项
        /// </summary>
        /// <param name="topRowBottomPane"></param>
        /// <param name="leftColumnRightPane"></param>
        /// <returns></returns>
        private string GetWorksheetOptions(int topRowBottomPane, intleftColumnRightPane)
        {
            string s = "";

            if (topRowBottomPane + leftColumnRightPane <= 0)
            {
                returns;
            }

            s += "<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
";
            s += "<Selected/>";
            s += "<FreezePanes/>
";
            s += "<FrozenNoSplit/>
";

            //冻结行
            if (topRowBottomPane > 0 && leftColumnRightPane <= 0)
            {
                s += "<SplitHorizontal>" + topRowBottomPane + "</SplitHorizontal>
";
                s += "<TopRowBottomPane>" + topRowBottomPane + "</TopRowBottomPane>
";
                //s += "<ActivePane>2</ActivePane>
";
                //s += "<Panes>
<Pane>
<number>3</Number>
</Pane>
<Pane>
<number>2</Number>
</Pane>
</Panes>
";
}
            //冻结列
            else if (leftColumnRightPane > 0 && topRowBottomPane <= 0)
            {
                s += "<SplitVertical>" + leftColumnRightPane + "</SplitVertical>
";
                s += "<LeftColumnRightPane>" + leftColumnRightPane + "</LeftColumnRightPane>
";
                //s += "<ActivePane>2</ActivePane>
";
                //s += "<Panes>
<Pane>
<number>5</Number>
</Pane>
<Pane>
<number>2</Number>
</Pane>
</Panes>
";
}
            //冻结行、列
            else{
                s += "<SplitHorizontal>" + topRowBottomPane + "</SplitHorizontal>
";
                s += "<TopRowBottomPane>" + topRowBottomPane + "</TopRowBottomPane>
";
                s += "<SplitVertical>" + leftColumnRightPane + "</SplitVertical>
";
                s += "<LeftColumnRightPane>" + leftColumnRightPane + "</LeftColumnRightPane>
";
                s += "<ActivePane>0</ActivePane>
";
                s += "<Panes>
<Pane>
<Number>3</Number>
</Pane>
<Pane>
<Number>1</Number>
</Pane>
<Pane>
<Number>2</Number>
</Pane>
<Pane>
<Number>0</Number>

</Pane>
</Panes>
";
}

            s += "<ProtectObjects>False</ProtectObjects>
";
            s += "<ProtectScenarios>False</ProtectScenarios>
";
            s += "</WorksheetOptions>
";

            returns;
        }

        #endregion

        /// <summary>
        ///导出到文件
        /// </summary>
        /// <param name="fileName"></param>
        public void Export(stringfileName)
        {
            if (this.Sheets.Count < 1)
            {
                throw new Exception("没有工作表!");
            }

            string fName =System.Web.HttpUtility.UrlEncode(System.Text.Encoding.UTF8.GetBytes(fileName));
            HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fName + ".xls");
            HttpContext.Current.Response.Charset = "UTF-8";
            HttpContext.Current.Response.ContentEncoding =System.Text.Encoding.UTF8;
            HttpContext.Current.Response.ContentType = "application/ms-excel";//image/JPEG;text/HTML;image/GIF;vnd.ms-excel/msword 
HttpContext.Current.Response.Write(_appHead);
            HttpContext.Current.Response.Write(_workBookHead);

            //遍历工作表
            foreach (Sheet sht inSheets)
            {
                HttpContext.Current.Response.Write("<Worksheet ss:Name="" + sht.SheetName + "">
");
                HttpContext.Current.Response.Write("<Table>
");

                //遍历行
                foreach (Row row insht.Rows)
                {
                    HttpContext.Current.Response.Write("" +row.RowText);
                }

                HttpContext.Current.Response.Write("</Table>
");

                
                //冻结窗格选项
                string sheetOptions =GetWorksheetOptions(sht.TopRowBottomPane, sht.LeftColumnRightPane);
                HttpContext.Current.Response.Write(sheetOptions);

                HttpContext.Current.Response.Write("</Worksheet>
");
            }

            HttpContext.Current.Response.Write("</Workbook>
");
            HttpContext.Current.Response.End(); 
        }
    }
}
View Code

调用方式为:

/*================下载自笔锋侠=======================================
    文件名:Default.aspx.cs
    功能说明:通过多种方式向工作簿添加工作表及行(记录),并可以根据需要设置数值格式。
    属性:功能测试代码
    其他:
    创建者标识:笔锋侠 2010年02月03日 
    QQ:86994549
=====================================================================*/

usingSystem;

namespaceExportExcel
{
    public partial class_Default : System.Web.UI.Page
    {
        protected void Page_Load(objectsender, EventArgs e)
        {

        }

        /// <summary>
        ///导出为Excel
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnExport_Click(objectsender, EventArgs e)
        {
            ExportTest();
        }

        /// <summary>
        ///导出测试
        /// </summary>
        protected voidExportTest()
        {
            ExcelXML excel = newExcelXML();
            excel.Sheets.Add("Sheet1");
            excel.Sheets.Add("Sheet5");
            excel.Sheets.Add("工作表1");
            excel.Sheets[0].Rows.AddTitle(new string[] { "编号", "部门", "日期" }, newValueType[] { ValueType.Number, ValueType.String, ValueType.String });
            excel.Sheets[0].Frozen(0, 1);
            excel.Sheets[0].Rows.Add(new string[] { "1a", "财务部", "2009-1-5"});
            excel.Sheets[0].Rows.Add(new string[] { "02", "市场部", "2010-01-20 15:35"});
            excel.Sheets[0].Rows.Add(new string[] { "3", "销售部", "15:20:37"});
            excel.Sheets[0].Rows.Add(new string[] { "", "销售部", "15:20:37"});
            excel.Sheets[0].Rows.Add(new string[] { "0", "销售部", "15:20:37"});
            excel.Sheets[0].Rows.Add(new string[] { "1234567890", "销售部", "15:20:37"});
            excel.Sheets[0].Rows.Add(new string[] { "12345678901", "销售部", "15:20:37"});
            excel.Sheets[0].Rows.Add(new string[] { "123456789012", "销售部", "15:20:37"});

            excel.Sheets[1].Rows.Add(new string[] { "1", "2", "3"});
            excel.Sheets[1].Rows.Add(new string[] { "1", "测字测试", "3"});
            excel.Sheets[1].Frozen(1, 0);

            excel.Sheets[2].Rows.Add(new string[] { "1", "2", "3"});
            excel.Sheets[2].Rows.Add(new string[] { "1", "测字测试", "3"});

            Sheet sheet = new Sheet("测试");
            sheet.Rows.AddTitle(new string[] { "编号", "部门", "日期", ""});
            for (int i = 1; i < 100; i++)
            {
                sheet.Rows.Add(new string[] { i.ToString(), "部门_" + i % 3, DateTime.Today.AddDays(i % 5).ToString(), (i * 100).ToString() });
            }
            sheet.Frozen(2, 1);
            excel.Sheets.Add(sheet);

            excel.Export(DateTime.Now.ToString("yyyyMMdd-HHmmss_") + "Export");
        }
    }
}
View Code

免责声明:文章转载自《不安装office的情况下如何实现对excel的导入导出》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【原创】进销存快速开发框架 (Winform三层架构+DevExpress+MsSQL)Jmeter常用控件三、Sampler下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

对Collections的遍历删除方式

以collections的子类List(Arraylist)为例 List<String> list=new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); list.add("d");...

Perl模式匹配

       Perl 内置的模式匹配让你能够简便高效地搜索大量的数据。不管你是在一个巨型的商业门户站点上用于扫描每日感兴趣的珍闻报道,还是在一个政府组织里用于精确地描述人口统计(或者人类基因组图),或是在一个教育组织里用于在你的 web 站点上生成一些动态信息,Perl 都是你可选的工具。这里的一部分原因是 Perl 的数据库联接能力,但是更重要的原因是...

postman 发送post请求,参数为json

mvc 控制器接收post请求,参数为json PostMan设置 Headers设置key和Value值 key:Content-Type,Value:application/json。 参数设置: 选中Body并进行参数设置,选择raw,格式为json。就酱 控制器代码: //post 请求测试 [HttpPost] //请求方法,...

entrySet用法 以及遍历map的用法

keySet是键的集合,Set里面的类型即key的类型entrySet是 键-值 对的集合,Set里面的类型是Map.Entry   1.keySet() Map map=new HashMap(); Iterator it=map.keySet().iterator(); Object key; Object value; while(it.hasNex...

【Android】是时候为你的应用加上WebDav同步了

WebDav是什么? WebDAV (Web-based Distributed Authoring and Versioning) 一种基于HTTP1.1协议的通信协议。它扩展了HTTP 1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可对Web Server直接读写,并支持写文件锁定(Locking)及解锁(...

C# Byte[]数组读取和写入文件

protected void ByteToString_Click(object sender, EventArgs e) { string content = this.txtContent.Text.ToString(); if (string.IsNullO...