2014-12-29 4 views
0

Я успешно экспортировал данные из gridview в Excel для одного рабочего листа, но хочу добавить несколько рабочих листов. У меня есть googled вокруг и попробовал несколько вариантов, но ничего не работает, но я приближаюсь. Я думаю, что это всего лишь несколько строк кода. Теперь у меня есть следующий код:Экспорт данных в Excel в MVC

public ActionResult Download() 
    { 
     if (Session["BP"] != null) 
     { 
      return new DownloadFileActionResult((GridView)Session["BP"], "BestPrices.xls"); 
     } 
     else 
     { 
      return new JavaScriptResult(); 
     } 
    } 

Я заселить переменный сеанс с помощью датируемого и GridView:

GridView gv = new GridView(); 
     gv.DataSource = gridTable; 

     gv.DataBind(); 
    // Session["BP"] = myGridViews; 
     Session["BP"] = g; 

Я построил массив GridViews, думая, что бы помочь, но я не могу экспортировать, что в настоящее время.

 GridView[] g = new GridView[retailerTables.Count]; 
     int n = 0; 
     foreach (string key in keys) 
     { 
      myGridViews[n] = retailerTables[key]; 
      g[n] = new GridView(); 
      g[n].DataSource = retailerTables[key]; 
      g[n].DataBind(); 
      n++; 


     } 

Основная идея заключается в том, что каждый рабочий лист в файле excel соответствует одному виду сетки.

Я видел различные сторонние варианты, но я не знаю, насколько они надежны, и если я в конечном итоге отлаживаю ошибки интерфейса. Я предпочитаю использовать основные классы и опции в MVC.

Приложение работает на веб-сайте, и пользователь щелкнет ссылку для загрузки файла.

Таблицы розничной торговли являются:

Dictionary<string, DataTable> retailerTables= new Dictionary<string, DataTable>(); 

Таким образом, каждый лист будет иметь данные о продажах для розничной торговли и пользователь может, наконец, просто нажмите на различных розничной торговли и просматривать данные о продажах.

Кто-нибудь знает, как решить проблему для экспорта нескольких таблиц, чтобы преуспеть, как я изложил.

+1

Вы не хотите использовать компоненты COM Excel для чего-либо на веб-сервере. Они не предназначены для использования там, и может произойти множество ошибок. Я использовал [EPPlus] (http://epplus.codeplex.com) для многих проектов, и он работает очень хорошо. С ним очень легко работать и с легкостью обрабатывать несколько листов. – krillgar

+0

Что сказал @krillgar. Обычно я использую [NPOI] (https://npoi.codeplex.com/) для своих потребностей Excel и не имею никаких жалоб. – Travis

+0

Я решил использовать NPOI. Я отправлю код позже. –

ответ

0

Я использовал nuget для установки npoi. Я использовал для использования операторы:

using NPOI.SS.UserModel; 
using NPOI.HSSF.UserModel; 
using NPOI.HSSF.Util; 


public void DataTablesToXls(Dictionary<string, DataTable> retailerTables, String filename, String allName) 
    { 

     var keys = new List<string>(retailerTables.Keys); 
     HSSFWorkbook xlsWorkBook = new HSSFWorkbook(); 
     IFont hlink_font = xlsWorkBook.CreateFont(); 
     ICellStyle hlink_style = xlsWorkBook.CreateCellStyle(); 

     HSSFFont bestpriceFont = (HSSFFont)xlsWorkBook.CreateFont(); 
     HSSFCellStyle bestpriceStyle = (HSSFCellStyle)xlsWorkBook.CreateCellStyle(); 
     bestpriceFont.Color = HSSFColor.Blue.Index; 
     bestpriceStyle.FillForegroundColor = HSSFColor.Blue.Index; 
     bestpriceStyle.SetFont(bestpriceFont); 


     HSSFFont priceFont = (HSSFFont)xlsWorkBook.CreateFont(); 
     HSSFCellStyle priceStyle = (HSSFCellStyle)xlsWorkBook.CreateCellStyle(); 
     priceFont.Color = HSSFColor.Red.Index; 
     bestpriceStyle.FillForegroundColor = HSSFColor.Red.Index; 
     priceStyle.SetFont(priceFont); 

     HSSFFont matchFont = (HSSFFont)xlsWorkBook.CreateFont(); 
     HSSFCellStyle matchStyle = (HSSFCellStyle)xlsWorkBook.CreateCellStyle(); 
     matchFont.Color = HSSFColor.Green.Index; 
     matchStyle.FillForegroundColor = HSSFColor.Green.Index; 
     matchStyle.SetFont(matchFont); 

     HSSFFont ordinaryFont = (HSSFFont)xlsWorkBook.CreateFont(); 
     HSSFCellStyle ordinaryStyle = (HSSFCellStyle)xlsWorkBook.CreateCellStyle(); 
     ordinaryFont.Color = HSSFColor.Black.Index; 
     ordinaryStyle.FillForegroundColor = HSSFColor.Black.Index; 
     ordinaryStyle.SetFont(ordinaryFont); 
     Dictionary<string, HSSFCellStyle> fonts = new Dictionary<string,HSSFCellStyle>(); 
     fonts.Add("best", bestpriceStyle); 
     fonts.Add("price", priceStyle); 
     fonts.Add("match", matchStyle); 
     fonts.Add("ordinary", ordinaryStyle); 


     string keyFont = "ordinary"; 
     foreach (string key in keys) 
     { 
      if (!(@key.Equals(allName))) 
      { 


       DataTable dt = retailerTables[key]; 


       ISheet retailerWorkSheet = xlsWorkBook.CreateSheet(@key); 


       IRow header = retailerWorkSheet.CreateRow(0); 

       int rcount = 0; 
       int colCount = 0; 

       colCount = 0; 
       IRow rheader = retailerWorkSheet.CreateRow(rcount); 
       foreach (DataColumn column in dt.Columns) 
       { 
        // Console.WriteLine(row[column]); 

        ICell c = rheader.CreateCell(colCount); 
        // c.SetCellValue(dt.Rows[0][column].ToString()); 
        c.SetCellValue(@column.ToString()); 

        colCount++; 
       } 

       Boolean matchRow = false; 
       rcount++; 
       foreach (DataRow row in dt.Rows) 
       { 
        colCount = 0; 
        IRow r = retailerWorkSheet.CreateRow(rcount); 

        Boolean bestpriceRow = false; 
        if (allName.Equals("all")) 
        { 
         if (row[dt.Columns[2]].Equals(@key)) // handling all data 
         { 
          bestpriceRow = true; 
          keyFont = "best"; 
         } else { 
          keyFont = "price"; 
         } 
        } 

        foreach (DataColumn column in dt.Columns) 
        { 
         // Console.WriteLine(row[column]); 

         HSSFCell c = (HSSFCell)r.CreateCell(colCount); 
         // retailerWorkSheet.AutoSizeColumn(column.Ordinal); 


         String rowVal = row[column].ToString(); 
         if (allName.Equals("none")) { 
          if (row[dt.Columns[3]].Equals(rowVal)) // handling all data 
          { 
           bestpriceRow = false; // show in red 
           matchRow = true; 
           keyFont = "match"; 
          } 
          else 
          { 
           bestpriceRow = false; 
           matchRow = false; 
           keyFont="ordinary"; 
          } 


         } 
         //  if (@key.Equals("all")) 
         //  { 
         //  hlink_font.Color = HSSFColor.Black.Index; 
         //  hlink_style.SetFont(hlink_font); 

         //  } else { 
        //  if (rowVal.Equals(@key)) 
        //  { 
        //   bestpriceRow = true; 
        //  } 

         //  } 


         if (rowVal != null) 
         { 
          if (rowVal.IndexOf("=HYPERLINK") != -1) 
          { 
           string[] celldata = new string[2]; 
           celldata = getCellData(rowVal); 

           // rowVal.IndexOf("\""); 

           // rowVal = rowVal.Replace("=HYPERLINK", ""); 
           //rowVal = rowVal.Replace("(", ""); 
           // rowVal = rowVal.Replace(")", ""); 
           // rowVal = rowVal.Replace("\",\"", ";"); 
          // string[] words = rowVal.Split(';'); 
           if (celldata!=null) 
           { 
           //  string cellValue = words[1]; 
            string cellLink = celldata[0]; 
           //  cellValue = cellValue.Replace("\"", ""); 
           // cellLink = cellLink.Replace("\"", ""); 
            string cellValue = celldata[1]; 
            HSSFHyperlink link = new HSSFHyperlink(HyperlinkType.Url); 
            link.Address = cellLink; 
            c.SetCellValue(cellValue); 
            c.Hyperlink = (link); 
            c.CellStyle= fonts[@keyFont]; 
           /*  if (bestpriceRow) 
            { 

             c.CellStyle = bestpriceStyle; 
            } 
            else 
            { 
             if (matchRow) 
             { 
              c.CellStyle = matchStyle; 
             } 
             else 
             { 
              c.CellStyle = priceStyle; 
             } 
            } */ 

           } 

          } 
          else 
          { 

           c.SetCellValue(row[column].ToString()); 
            c.CellStyle= fonts[@keyFont]; 
          /* if (bestpriceRow) 
           { 

            c.CellStyle = bestpriceStyle; 
           } 
           else 
           { 
            if (matchRow) 
            { 
             c.CellStyle = matchStyle; 
            } 
            else 
            { 
             c.CellStyle = priceStyle; 
            } 
           } */ 

          } 
         } 
         else 
         { 

          c.SetCellValue(row[column].ToString()); 
          c.CellStyle= fonts[@keyFont]; 
          /* if (bestpriceRow) 
          { 

           c.CellStyle = bestpriceStyle; 
          } 
          else 
          { 
           if (matchRow) 
           { 
            c.CellStyle = matchStyle; 
           } 
           else 
           { 
            c.CellStyle = priceStyle; 
           } 
          } */ 

         } 

         colCount++; 
        } 
        rcount++; 
       } 


      } 

      // retailerTables[key] 
     } 

     string folderPath = Server.MapPath("~/Content/data"); 
     string datafile = Path.Combine(folderPath, filename); 


     FileStream file = new FileStream(datafile, FileMode.CreateNew); 
     xlsWorkBook.Write(file); 
     file.Close(); 


    } 
Смежные вопросы