首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

关于操作Excel多个Sheet的有关问题

2013-03-01 
关于操作Excel多个Sheet的问题public static void ExportExcel(string TemplatePath, Hashtable hashtable

关于操作Excel多个Sheet的问题


        public static void ExportExcel(string TemplatePath, Hashtable hashtable)
        {
            string strFileName = HttpContext.Current.Server.MapPath(TemplatePath);

            beforeTime = DateTime.Now;
            Object oMissing = System.Reflection.Missing.Value;
            Excel.Application ex = new Excel.Application();
           

            ex.DisplayAlerts = false;
            ex.ScreenUpdating = false;

            ex.Workbooks.Open(strFileName, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);

            Excel.Workbook workbook = ex.Application.ActiveWorkbook;
            Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Sheets[1];//from 1 not 0

            foreach (object key in hashtable.Keys)
            {
                if (hashtable[key].GetType() == typeof(DataTable))
                {
                    DataTable dataTable = (DataTable)hashtable[key];

                    int nRowCount = dataTable.Rows.Count;
                    int nColumnCount = dataTable.Columns.Count;

                    #region 如果超過2000行 將截斷DataTable
                    if (nRowCount > 2000)
                    {
                        for (int rowIndex = 0; rowIndex < dataTable.Rows.Count; rowIndex++)
                        {
                            if (rowIndex > 2000)
                            {


                                dataTable.Rows.RemoveAt(rowIndex);

                                rowIndex--;
                            }
                        }
                    }
                    #endregion

                    Excel.Range range = worksheet.Cells.Find("$" + key + "$", oMissing, oMissing, Excel.XlLookAt.xlWhole, oMissing, Excel.XlSearchDirection.xlNext, oMissing, oMissing, oMissing);

                    int startRowIndex = range.Row;

                    object[,] valueRange = new object[nRowCount, nColumnCount];

                    int i = 0;
                    int j = 0;

                    Excel.Range row;
                    foreach (DataRow dataRow in dataTable.Rows)
                    {
                        row = (Excel.Range)worksheet.Rows[startRowIndex + 1, oMissing];
                        row.Insert(oMissing, oMissing);
                        row = (Excel.Range)worksheet.Rows[startRowIndex, oMissing];
                        row.Copy(oMissing);
                        row = (Excel.Range)worksheet.Rows[startRowIndex + 1, oMissing];
                        row.PasteSpecial(Excel.XlPasteType.xlPasteFormats, Excel.XlPasteSpecialOperation.xlPasteSpecialOperationAdd, oMissing, oMissing);

                        j = 0;



                        foreach (DataColumn dataColumn in dataTable.Columns)
                        {
                            //if (dataColumn.DataType == typeof(DateTime))
                            //{
                            //    if (dataRow[dataColumn] != DBNull.Value)
                            //        valueRange[i, j] = ((DateTime)dataRow[dataColumn]).ToShortDateString();
                            //}
                            //else
                            valueRange[i, j] = dataRow[dataColumn];

                            j++;
                        }

                        i++;
                    }

                    Excel.Range rowDelete = (Excel.Range)worksheet.Rows[startRowIndex + nRowCount, oMissing];
                    rowDelete.Delete(oMissing);

                    //j = 1;

                    //foreach (DataColumn dataColumn in dataTable.Columns)
                    //{
                    //    if (dataColumn.DataType == typeof(string))
                    //        worksheet.get_Range(worksheet.Cells[startRowIndex, j], worksheet.Cells[startRowIndex + nRowCount - 1, j]).NumberFormat = "@";

                    //    j++;


                    //}

                    worksheet.get_Range(worksheet.Cells[startRowIndex, 1], worksheet.Cells[startRowIndex + nRowCount - 1, nColumnCount]).Value2 = valueRange;


                }
                else
                {
                    //当是图片时,限定参数标式有pic..
                    if (key.ToString().ToLower().IndexOf("pic") < 0)
                    {
                        worksheet.Cells.Replace("$" + key + "$", hashtable[key], Excel.XlLookAt.xlPart, oMissing, oMissing, oMissing, oMissing, oMissing);
                    }
                    else
                    {
                        if (hashtable[key].ToString() != "")
                        {
                            Excel.Range range = worksheet.Cells.Find("$" + key + "$", oMissing, oMissing, Excel.XlLookAt.xlWhole, oMissing, Excel.XlSearchDirection.xlNext, oMissing, oMissing, oMissing);
                            range.Select();
                            int row = range.Row;
                            int col = range.Column;
                            string ColumnName = returnExcelColumnName(col) + row.ToString();
                            InsertPicture(range, worksheet, ColumnName, hashtable[key].ToString());
                            range.Cells.Value2 = "";
                        }


                        else
                        {
                            worksheet.Cells.Replace("$" + key + "$", hashtable[key], Excel.XlLookAt.xlPart, oMissing, oMissing, oMissing, oMissing, oMissing);
                        }                       
                    }
                }


            }
            afterTime = DateTime.Now;
            string strFileName1 = Path.GetFileNameWithoutExtension(strFileName);
            strFileName1 += "_" + DateTime.Now.ToString("yyyy-MM-dd-hh") + Path.GetExtension(strFileName);

            string strExportExcel = HttpContext.Current.Server.MapPath("~/log/ExportExcel/" + DateTime.Today.ToString("yyyyMM"));

            if (!Directory.Exists(strExportExcel))
                Directory.CreateDirectory(strExportExcel);


            strFileName = strExportExcel + "\" + strFileName1;


            workbook.SaveAs(strFileName, Excel.XlFileFormat.xlWorkbookNormal, oMissing, oMissing, oMissing, oMissing, Excel.XlSaveAsAccessMode.xlExclusive, oMissing, oMissing, oMissing, oMissing, oMissing);
            workbook.Close(oMissing, oMissing, oMissing);
            //string strValue1="";
            //Excel.XmlMap aaa =worksheet. new ;
            //workbook.SaveAsXMLData("", aaa);
            //Excel.XlXmlExportResult bbb = aaa.ExportXml(out strValue1);



            try
            {
                //将数字格式化为金额(要格式化的单元格内的值必须为数值型)
                //xlsheet.get_Range(xlsheet.Cells[2, 1], xlsheet.Cells[10, 15]).set_NumberFormat("000000");
                //xlsheet.get_Range(xlsheet.Cells[2, 1], xlsheet.Cells[10, 15]).set_NumberFormat("¥#,##0.00");


                //xlsheet.Export(@"D:\WorldVision\source\WorldVision\WVWeb\_TestOWC.xls", SheetExportActionEnum.ssExportActionNone, SheetExportFormat.ssExportXMLSpreadsheet);

                DownFile(HttpContext.Current.Response, strFileName1, strFileName);
                //SetResponse(strFileName, "");//用这个会报错catch中

            }
            catch
            {
                KillExcelProcess();
                throw;
            }
            finally
            {
                if (ex != null)
                {
                    ex.Application.Workbooks.Close();
                    ex.Quit();
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(ex);
                    ex = null;
                    GC.Collect();
                    KillExcelProcess();
                }
            }
        }



这里是导出单个Excel Sheet的方法,现在要改成 导出多个Sheet的,我想

worksheet.Copy(Type.Missing, workbook.Sheets[1]);

复制一个Sheet后,在对其他Sheet进行操作,但是不知道怎么对其他Sheet进行操作。

求教育。关于操作Excel多个Sheet的有关问题 excel C#? Sheet
[解决办法]
DataTable dtExcelSchema = Excel_conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });//建立连接Excel的数据表
                    string SheetName = "";
                    SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();//取出第一个工作表我名称

第二个就Rows[1]
依此类推
[解决办法]
Workbook.Sheets.Add


一、ActiveWorkbook.Sheets.Add语法



ActiveWorkbook.Sheets.Add方法,有四个参数,分别是:

Before:Variant 类型,可选。指定工作表对象,新建的工作表将置于此工作表之前。

After:Variant 类型,可选。指定工作表对象,新建的工作表将置于此工作表之后。

Count:Variant 类型,可选。要新建的工作表的数目。默认值为 1。

Type:Variant 类型,可选。指定工作表类型。

ActiveWorkbook.Sheets.Add方法使用公式如下:

ActiveWorkbook.Sheets.Add 参数:=参数值

如:ActiveWorkbook.Sheets.Add Count:=6 其功能是:在当前工作薄的前面,插入新的六个工作表。

二、通过ActiveWorkbook.Sheets.Add将新表插入到最后

根据一的基础,下面,我们来实现本文的难题:在任何时候,如何让新表插入到最后?

使用如下代码即可:

ActiveWorkbook.Sheets.Add after:=Worksheets(Worksheets.Count)

代码解释,after参数的含义是,在某某表的后面插入新表。Worksheets.Count的含义是,所有表的总数;

现在,完整的看这行代码:

ActiveWorkbook.Sheets.Add after:=Worksheets(Worksheets.Count)

其含义是,在当前所有表的总数(也就是最后一个表拉,因为最后一个表的序号刚好就是所有表的总数)的后面插入新表。

三、其它类似的代码

A:ActiveWorkbook.Sheets.Add.Name = "工作表名称";插入一个给定名称的工作表;

B:ActiveWorkbook.Sheets.Add.Name = Format(Date, "yy-mm-dd");插入一个以年-月-日为名称的工作表;

C:ActiveWorkbook.Sheets.Add before:=Worksheets("Sheet1");在Sheet1之前插入一个工作表;

D:综合运行的代码

ActiveWorkbook.Sheets.Add Before:=Worksheets("Sheet6")

ActiveSheet.Name = "我是刚插入的"

以上两行代码的功能是,指定新插入表出现在Sheet6的前面,并且,指定要使用我是刚插入的为表的名称

热点排行