2016-10-04 37 views
1

假定打开一个新的Excel文件并输入数据。外部C#应用程序能否挂钩到Excel进程并从中获取数据?另外,Excel文件从不保存到文件中。是否可以通过内存从Excel中导入数据?

难道这样做很难吗?你也可以指出我如何实现这一目标的正确方向。

+0

你想要一个C#应用程序读取Excel存储在内存中的特定文件的内容吗?听起来像是一种痛苦,如果甚至可以做到的。 –

+0

不,大多数操作系统的应用程序安全模型都不允许这样做! – Illuminati

+0

http://stackoverflow.com/questions/3746409/how-to-read-some-data-from-a-windows-application-memory也许有帮助 – Hozikimaru

回答

0

只需将此代码添加到添加了名为“button1”的按钮的windows窗体应用程序的代码背后。此示例代码将遍历Excel文件的单元格,并在消息框中显示每个单元格的内容。当然,需要项目引用“Microsoft.Office.Interop.Excel”。

不要忘了实际创建excel文件,在这个例子中我使用了这个路径“C:\ ExcelData \ DataToImp.xlsx”。

using Excel = Microsoft.Office.Interop.Excel; 


    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Excel.Application xlApp; 
     Excel.Workbook xlWorkBook; 
     Excel.Worksheet xlWorkSheet; 
     Excel.Range range; 

     string str; 
     int rCnt = 0; 
     int cCnt = 0; 

     xlApp = new Excel.Application(); 
     xlWorkBook = xlApp.Workbooks.Open("C:\\ExcelData\\DataToImp.xlsx", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); 
     xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 

     range = xlWorkSheet.UsedRange; 

     for (int rowIndex = 1; rowIndex <= range.Rows.Count; rowIndex++) 
     { 
      for (int columnIndex = 1; columnIndex <= range.Columns.Count; columnIndex++) 
      { 
       Excel.Range rangeTest = range.Cells[rowIndex, columnIndex] as Excel.Range; 

       if (rangeTest.MergeCells)// && rangeTest.Value2 == null) 
       { 
        //continue; 

        int columns = rangeTest.Columns.Count; 
        columnIndex += columns; 
       } 

       MessageBox.Show("m " + (string)rangeTest.Value2); 

      } 
     } 

     xlWorkBook.Close(true, null, null); 
     xlApp.Quit(); 

     releaseObject(xlWorkSheet); 
     releaseObject(xlWorkBook); 
     releaseObject(xlApp); 
    } 

    private void releaseObject(object obj) 
    { 
     try 
     { 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
      obj = null; 
     } 
     catch (Exception ex) 
     { 
      obj = null; 
      MessageBox.Show("Unable to release the Object " + ex.ToString()); 
     } 
     finally 
     { 
      GC.Collect(); 
     } 
    } 
+1

这也是我的第一次。关于OP的警告是,不能,你不能拿一个已经打开的Excel并且以这种方式“挂钩”,你必须首先运行你自己打开Excel的程序,并且从那里你将能够阅读任何人的类型进去。 – Quantic

+1

是的,就是这样做的,在Excel中做了一些数据修改之后,文件也必须“保存”在磁盘上。 – Clock

+1

也不需要应用程序“打开”Excel,它只是读取文件。没有必要让这个Excel工作。 – Clock

相关问题