2015-07-06 63 views
1

我編寫了一個程序,用於從數據庫中查詢並創建一個包含查詢結果的xml文件。如何使包含xml文件中的元素的啓用宏的excel文件?C#從我自己的XML文件中創建一個excel文件

這裏是其位於我的驅動器C的XML文件的一個短樣品:(I置換爲XXXX一些份)

<JobSvc environment="TEST" dateTo="6/22/2015" dateFrom="2015-06-15T00:00:00+08:00"> 
    <process server="XXXX" type="XXXX" name="XXXX"> 
    <processId duration="2421" eventTime="6/1/2015 11:41:26 AM" source="TEST SOURCE" num="3">PROCESS ID</processId> 
    </process> 
</JobSvc> 

這是我在從XML文件生成excel文件嘗試(我從互聯網上得到它,不幸的是,這是行不通的,但它也因爲我的計劃例外創建日誌不會產生異常或錯誤..):

public void xmlToExcel() 
     { 
      Excel.Application xlApp; 
      Excel.Workbook xlWorkBook; 
      Excel.Worksheet xlWorkSheet; 
      object misValue = System.Reflection.Missing.Value; 
      DataSet ds = new DataSet(); 
      XmlReader xmlFile; 
      int i = 0; 
      int j = 0; 
      xlApp = new Excel.Application(); 
      xlWorkBook = xlApp.Workbooks.Add(misValue); 
      xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 
      xmlFile = XmlReader.Create(@"C:\PerformanceMonitorXML " + DateTime.Now.ToString("dd_MM_yyyy") + ".xml", new XmlReaderSettings()); 
      ds.ReadXml(xmlFile); 
      for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++) 
      { 
       for (j = 0; j <= ds.Tables[0].Columns.Count - 1; j++) 
       { 
        xlWorkSheet.Cells[i + 1, j + 1] = ds.Tables[0].Rows[i].ItemArray[j].ToString(); 
       } 
      } 
      xlWorkBook.SaveAs("C\\PerformanceMonitorExcel " + DateTime.Now.ToString("dd_MM_yyyy") + ".xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); 
      xlWorkBook.Close(true, misValue, misValue); 
      xlApp.Quit(); 
      releaseObject(xlApp); 
      releaseObject(xlWorkBook); 
      releaseObject(xlWorkSheet); 



     } 

     private void releaseObject(object obj) 
     { 
      try 
      { 
       System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
       obj = null; 
      } 
      catch (Exception ex) 
      { 
       obj = null; 
      } 
      finally 
      { 
       GC.Collect(); 
      } 
     } 

回答

0

最有可能的問題是與你的特權。如果您想保存在C上,您必須以管理員權限運行VS。除此之外還有一個錯字。此外,我建議寫入excel而不是逐個單元格,但在對象數組中。那下面的代碼爲我工作>

Microsoft.Office.Interop.Excel.Application xlApp; 
Microsoft.Office.Interop.Excel.Workbook xlWorkBook; 
Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet; 
object misValue = System.Reflection.Missing.Value; 
DataSet ds = new DataSet(); 
XmlReader xmlFile; 
xlApp = new Microsoft.Office.Interop.Excel.Application(); 
xlWorkBook = xlApp.Workbooks.Add(misValue); 
xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 
xmlFile = XmlReader.Create(@"C:\example.xml", new XmlReaderSettings()); 
ds.ReadXml(xmlFile); 
object[,] objects = new object[ds.Tables[0].Rows.Count, ds.Tables[0].Columns.Count]; 
for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
{ 
    for (int j = 0; j < ds.Tables[0].Columns.Count; j++) 
    { 
     objects[i, j] = ds.Tables[0].Rows[i][j].ToString(); 
    } 
} 
Microsoft.Office.Interop.Excel.Range range = xlWorkSheet.get_Range("A1", "D3"); 
range.Value = objects; 
releaseObject(range); 
xlWorkBook.SaveAs("C:\\PerformanceMonitorExcel " + DateTime.Now.ToString("dd_MM_yyyy") + ".xls", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); 
xlWorkBook.Close(true, misValue, misValue); 
xlApp.Quit(); 
releaseObject(xlApp); 
releaseObject(xlWorkBook); 
releaseObject(xlWorkSheet); 
MessageBox.Show("finished"); 

示例XML是>

<root> 
    <JobSvc environment="TEST" dateTo="6/22/2015" dateFrom="2015-06-15T00:00:00+08:00"> 
    <process server="XXXX" type="XXXX" name="XXXX"> 
     <processId duration="2421" eventTime="6/1/2015 11:41:26 AM" source="TEST SOURCE" num="3">PROCESS ID</processId> 
    </process> 
    </JobSvc> 
    <JobSvc environment="TEST" dateTo="6/23/2015" dateFrom="2015-06-15T00:00:00+08:00"> 
    <process server="XXXX" type="XXXX" name="XXXX"> 
     <processId duration="2421" eventTime="6/1/2015 11:41:26 AM" source="TEST SOURCE" num="3">PROCESS ID</processId> 
    </process> 
    </JobSvc> 
    <JobSvc environment="TEST" dateTo="6/24/2015" dateFrom="2015-06-15T00:00:00+08:00"> 
    <process server="XXXX" type="XXXX" name="XXXX"> 
     <processId duration="2421" eventTime="6/1/2015 11:41:26 AM" source="TEST SOURCE" num="3">PROCESS ID</processId> 
    </process> 
    </JobSvc> 
</root> 

BR,馬頓

+0

我會嘗試。 –

+0

我得到這個異常: 'System.IO.IOException:進程無法訪問文件'C:\ PerformanceMonitorXML 06_07_2015.xml',因爲它正在被另一個進程使用。順便說一句,我在Windows服務上運行這個代碼,上面的異常是由我的日誌創建者創建的...我沒有打開該文件,我不知道爲什麼它給了我這種異常。 –

+0

當我打開任務管理器時,有多個EXCEL.exe實例* 32 –