2016-08-19 50 views
1

我有一个表单,允许用户从网格上的列表中选择项目,并允许他们导出与选定项目对应的数据。数据应导出到现有的Excel模板。我尝试了一些代码,但是发生什么情况是下载的excel文件打开时显示空白。你能帮我解释为什么它发生,我的代码有什么问题。数据没有在excel文件上填充C#

下面是我的代码:在此先感谢

try 
     { 

      UpdateDataSelection(); 

      string pFileName = "SubconOneLineList_" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".xls"; 

      string pSubConCodeLists = string.Empty; 
      string pJobCodeKey = string.Empty; 

      string pCountryCode = string.Empty; 
      string pWorkCategoryCode = string.Empty; 
      string pCapacityCode = string.Empty; 
      string pOperativeCountryCode = string.Empty; 

      string pNameAbbr = string.Empty; 
      string pAffiliates = string.Empty; 

      pSubConCodeLists = string.Join(",", DataSelection); 
      if (pSubConCodeLists == string.Empty) 
      { 
       GetSubconDatabaseFilter(out pSubConCodeLists, out pNameAbbr, out pJobCodeKey, out pCountryCode, out pOperativeCountryCode, out pWorkCategoryCode, out pAffiliates, out pCapacityCode); 
      } 

      string pGridFilter = (rgvSubcontractor.MasterTableView.FilterExpression == null ? string.Empty : rgvSubcontractor.MasterTableView.FilterExpression); 
      string pSortString = ""; 
      if (rgvSubcontractor.MasterTableView.SortExpressions != null) 
      { 
       pSortString = ((rgvSubcontractor.MasterTableView.SortExpressions.GetSortString() == null) || (rgvSubcontractor.MasterTableView.SortExpressions.GetSortString() == string.Empty) ? pSortString : rgvSubcontractor.MasterTableView.SortExpressions.GetSortString()); 
      } 
      pSortString = (pSortString == string.Empty ? "COMPANY_NAME ASC" : pSortString + ", COMPANY_NAME ASC"); 

      DataTable pDTSubconOneLineList = mSubContractorBS.getRptSubContractorOneLineList(pSubConCodeLists, pNameAbbr, string.Empty, string.Empty, pJobCodeKey, pCountryCode, pOperativeCountryCode, pWorkCategoryCode, pAffiliates, pCapacityCode); 
      DataView pDVSubconOneLineList = new DataView(pDTSubconOneLineList); 
      if (pGridFilter != string.Empty) 
      { 
       pDVSubconOneLineList.RowFilter = pGridFilter; 
      } 
      pDVSubconOneLineList.Sort = pSortString; 
      pDTSubconOneLineList = pDVSubconOneLineList.ToTable(); 

      pDTSubconOneLineList.TableName = "USP_RPT_SUBCON_ONE_LINE_LIST"; 


      Process[] processList = Process.GetProcesses(); 


      string path = Server.MapPath("~") + "\\SIS\\Template\\Download\\Subcon_Profile_List_Import_Template.xlsx"; 
      //string targetPath = Convert.ToString(Session["App_Data_Path"]) + "EXPORT_OUTPUT"; 
      string targetPath = Convert.ToString(Server.MapPath("~")) + "EXPORT_OUTPUT"; 
      string destFile = System.IO.Path.Combine(targetPath, pFileName); 

      if (!Directory.Exists(targetPath)) 
      { 
       Directory.CreateDirectory(targetPath); 
      } 

      File.Copy(path, destFile, true); 

      object misValue = System.Reflection.Missing.Value; 

      Excel.Application xlApp = new Excel.Application(); 
      Excel.Workbook xlWorkBook = xlApp.Workbooks.Open(destFile, 0, false, 5, "", "", true, Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); 

      Excel.Worksheet xlWorkSheet = (Excel.Worksheet)xlWorkBook.Sheets[1]; 
      xlWorkSheet.get_Range("A2", "AN" + xlWorkSheet.Rows.Count.ToString()).Clear(); 

      object[,] objData = null; 

      int rowcount = pDTSubconOneLineList.Rows.Count; 

      objData = new Object[pDTSubconOneLineList.Rows.Count, pDTSubconOneLineList.Columns.Count]; 

      for (int row = 0; row < pDTSubconOneLineList.Rows.Count; row++) 
      { 
       for(int column= 0; column < pDTSubconOneLineList.Columns.Count; column++) 
       { 
        objData[row, column] = pDTSubconOneLineList.Rows[row][column].ToString(); 
       } 
      } 

      ((Excel.Worksheet)xlWorkBook.Sheets[1]).Select(Type.Missing); 

      xlWorkBook.Save(); 
      xlWorkBook.Close(true, misValue, misValue); 
      xlApp.Quit(); 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook); 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet); 
      xlWorkSheet = null; 
      xlWorkBook = null; 
      xlApp = null; 
      GC.Collect(); 

      string pMimeType = string.Empty; 
      string pEncoding = string.Empty; 
      string pExtension = string.Empty; 

      Response.Buffer = true; 
      Response.Clear(); 
      Response.AppendCookie(new HttpCookie("fileDownloadToken", hdDownLoadToken.Value)); 
      Response.ContentType = pMimeType; 
      Response.AddHeader("content-disposition", "attachment; filename=" + pFileName); 
      Response.Flush(); 
     } 
     catch (Exception ex) 
     { 
      ErrorHelper.HandleError(ex); 
     } 
+1

快速的问题。你检查过你的数据表是否包含行和列。行数和列数是多少? – 2016-08-19 03:55:17

+0

不要采用这种方法来编写Excel文件。创建Excel应用程序的实例会随着时间的推移导致内存泄漏,Office应用程序不属于Web服务器。还有其他工具(库),甚至是免费的,可以编写excel。如果只是原始数据,请使用CSV格式编写,但使用扩展名XLS保存。它会工作! –

回答

1

你实际上并没有写入数据到表。

你之后的for循环填充objData,尝试:

Excel.Range targetRange = xlWorkSheet.get_Range("A2", "AN" + xlWorkSheet.Rows.Count.ToString()); 
targetRange.Value = objData; 
+0

感谢您的回复。我试过你提供的代码,现在发生的是当excel文件被下载时说已损坏但仍然可以打开,当我打开它时,它包含表单的布局。当我打开文件副本时,它显示数据,但重复到最后一个单元格。我不知道发生了什么事。 – geekypanda

+0

在设置objData之前,您可以在调试模式下检查pDTSubconOneLineList是否不包含重复值?写入Excel看起来没问题。我怀疑你的数据选择可能有问题。 – 2016-08-22 08:25:23

+0

之前为导出数据所做的代码是通过由不同程序员完成的RDLC完成的。 'ReportDataSource pRds = new ReportDataSource(“USP_RPT_SUBCON_ONE_LINE_LIST”,pDTSubconOneLineList); '这是数据源。然后在目前我刚拿到数据表,我想这就是为什么它重复出口时。如何包含与旧代码相同的sp? – geekypanda