Excel文件导入DataTable(2) -- 直接打开Excel文件

通过OleDb导入方便很多,但是有时候我们想直接操作Excel文件。使用Excel的Com组件。

首先导入Microsoft.Office.Interop.Excel,我的是Office2007,对应版本号为12.0.0.0

再添加命名空间:
using System.Data;
using Excel = Microsoft.Office.Interop.Excel;

其余部分代码如下:

ContractedBlock.gif ExpandedBlockStart.gif ReadExcel
public void ReadExcel(string FilePath)
ExpandedBlockStart.gifContractedBlock.gif
{
    
object Nothing = System.Reflection.Missing.Value;
             
    Excel.Application xlApp 
= null;
    Excel.Workbooks workbooks 
= null;
    Excel.Workbook workbook 
=  null;
    Excel.Sheets sheets  
= null;
    Excel.Worksheet worksheet 
= null;
    Excel.Range range1 
= null;
    Excel.Range range2 
= null;
        
    
try
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
                  
        xlApp 
= new Excel.Application();
            
        
if(xlApp == null)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            MessageBox.Show(
"无法创建Excel对象,可能您未安装Excel");
            
return;
        }

            
        workbooks
=xlApp.Workbooks;
        workbook 
= workbooks.Add(FilePath);
        sheets 
= workbook.Sheets;
        worksheet 
= (Excel.Worksheet)sheets.get_Item(1);
                
        
int rowCount = worksheet.UsedRange.Rows.Count;
        
int colCount = worksheet.UsedRange.Columns.Count;
                
        
if (rowCount <= 0)
            
throw new Exception("文件中没有数据记录");
                
        DataTable dataTable 
= new DataTable();
            
        
//此处开设二维数组,因为Range.Value2只能强制转换为二位数组
        
//并且rang1强转时,对应二位数组编号从1,1开始!
        
//即二维数组0行0列均为null。
        Object[,] tempObject2 = new object[2,colCount+1];
        range1 
= worksheet.get_Range(worksheet.Cells[1,1],worksheet.Cells[1,colCount]);
        tempObject2 
= (Object[,])range1.Value2;
            
        
for(int i=1; i<=colCount; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            dataTable.Columns.Add(tempObject2[
1,i].ToString(),System.Type.GetType("System.String"));        
        }
                
                
        
//此处如果继续使用range1,则必须首先使用Resize函数,重置rang1的大小!!
        Object[,] tempObject = new object[rowCount,colCount+1];
        range2
=worksheet.get_Range(worksheet.Cells[2,1],worksheet.Cells[rowCount,colCount]);
        tempObject 
= (object[,])(range2.Value2);
                                        
        
for(int j=1; j<rowCount-1; j++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            DataRow dr1 
= dataTable.NewRow();
            
for(int i=1; i<colCount+1; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                dr1[i
-1]=tempObject[j,i].ToString();
            }
                    
            dataTable.Rows.Add(dr1);
        }

                
        
//自己创建一个DataGrid,将datatable作为数据源
        this.dataGrid1.DataSource = dataTable;
                
       }
    
       
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif       
{
           
//结束Excel进程!有待进一步研究。
        if (xlApp != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif           
{
               
if (workbooks != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif               
{
                 
if (workbook != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                   
{
                       
if (worksheet != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                       
{
                          
if (range1 != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                           
{
                               System.Runtime.InteropServices.Marshal.ReleaseComObject(range1);
                               range1 
= null;
                           }

                           
if (range2 != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                           
{
                               System.Runtime.InteropServices.Marshal.ReleaseComObject(range2);
                               range2 
= null;
                           }

                           System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
                           worksheet 
= null;
                        }

                       workbook.Close(
false,Nothing,Nothing); 
                       System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
                       workbook 
= null;
                   }

                   workbooks.Close();
                   System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
                   workbooks 
= null;
               }

               xlApp.Application.Workbooks.Close();
               xlApp.Quit();
               System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
               xlApp 
= null;
               GC.Collect();
        }

       }

}

转载于:https://www.cnblogs.com/TongjiSSE/archive/2009/08/27/1555063.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值