Запись строк DataReader в файл Excel

У меня есть данные в SQL Server 2000, и у меня есть HyperLink, который идет в сквозную форму, чей программный код будет выводить данные в файл Excel. Я следовал этому уроку:

http://www.dzone.com/links/r/export_gridview_to_excelcsv_in_net_using_c.html

Мне удалось вывести некоторые образцы значений из DataReader. Первая проблема, с которой я сталкиваюсь, заключается в том, что в 1.1 нет метода DataTable Load. У меня есть данные, возвращаемые через DataReader, но мне нужна помощь в том, как создать заголовки и вывести их вместе со строками данных в файл Excel ...

Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.Buffer = true;

string attachment 
    = "attachment;filename=Report_" + DateTime.Now.ToString() + ".xls"; 
Response.AddHeader("content-disposition", attachment);

Response.Charset = string.Empty;
Response.Cache.SetCacheability(System.Web.HttpCacheability.Public);
Response.ContentType = "application/ms-excel";

DataTable dt = new DataTable();
dt.Columns.Add("Company");
dt.Columns.Add("Address1");
dt.Columns.Add("Address2");
dt.Columns.Add("City");
dt.Columns.Add("State");
dt.Columns.Add("ZipCode");

SqlConnection con = new SqlConnection();
SqlCommand com = new SqlCommand();
con.ConnectionString = "myconnstring";
com.Connection = con;
com.CommandText 
    = "SELECT DISTINCT  Company, Address1, Address2, City, State, ZipCode" + 
      " FROM Vendor_View";
con.Open();

SqlDataReader dr = com.ExecuteReader();
while(dr.Read())
{
    // how to grab and output data to Excel? 
}

Ответы на вопрос(2)

Решение Вопроса

то просто создайте файл CSV. Excel можно настроить, чтобы открыть их довольно легко.

Что-то вроде следующего поможет вам начать:

response.ContentType = "text/csv";
response.AddHeader("Content-Disposition", "attachment;filename=report.csv;");
response.AddHeader("Pragma", "no-cache");
response.AddHeader("Expires", "0");

// 1. output columns
Boolean addComma = false;
response.Write("\"");
foreach (DataColumn column in _dataToProcess.Columns) {
    if (addComma) {
        response.Write("\",\"");
    } else {
        addComma = true;
    }
    response.Write(column.ColumnName.ToString());
} // foreach column
response.Write("\"");


response.Write(System.Environment.NewLine);

// 2. output data
foreach (DataRow row in _dataToProcess.Rows) {
    addComma = false;
    response.Write("\"");
    foreach (Object value in row.ItemArray) {
        // handle any embedded quotes.
        String outValue = Convert.ToString(value).Replace("\"", String.Empty);
        if (addComma) {
            response.Write("\",\"");
        } else {
            addComma = true;
        }
        response.Write(outValue);
    }
    response.Write("\"");
    response.Write(System.Environment.NewLine);
} // foreach row
 NotMe08 февр. 2012 г., 18:03
@IrishChieftain: см. Обновление
 NotMe02 февр. 2012 г., 22:36
Это будет первый ряд, который вы испускаете ...
 IrishChieftain02 февр. 2012 г., 22:34
А как насчет заголовков (имен столбцов)?
 IrishChieftain09 февр. 2012 г., 01:16
Спасибо Крис, получил решение из вашего примера кода плюс это:itjungles.com/dotnet/...

Я сам написал блогПочта об этом. В основном есть 3 варианта. Но я рекомендую этот:

//Make sure you add this reference and have it imported
Using Excel = Microsoft.Office.Interop.Excel;

protected void xlsWorkBook()
{
     Excel.Application oXL;
     Excel.Workbook oWB;
     Excel.Worksheet oSheet;
     Excel.Range oRange;
     // Start Excel and get Application object.
     oXL = new Excel.Application();
     // Set some properties
     oXL.Visible = true;
     oXL.DisplayAlerts = false;
     // Get a new workbook.
     oWB = oXL.Workbooks.Add(Missing.Value);
     // Get the active sheet
     oSheet = (Excel.Worksheet)oWB.ActiveSheet;
     oSheet.Name = “Customers”;
     // Process the DataTable
     // BE SURE TO CHANGE THIS LINE TO USE *YOUR* DATATABLE
     //DataTable dt = Customers.RetrieveAsDataTable();//commented
     DataTable dt = Table;//added
     Session["dt"] = dt;//added
     int rowCount = 1;
     foreach (DataRow dr in dt.Rows)
     {
        rowCount += 1;
        for (int i = 1; i < dt.Columns.Count + 1; i++)
        {
            // Add the header the first time through
            if (rowCount == 2)
            {
               oSheet.Cells[1, i] = dt.Columns[i - 1].ColumnName;
            }
       oSheet.Cells[rowCount, i] = dr[i - 1].ToString();
        }
    }
    // Resize the columns
    oRange = oSheet.get_Range(oSheet.Cells[1, 1],
    oSheet.Cells[rowCount, dt.Columns.Count]);
    oRange.EntireColumn.AutoFit();
    // Save the sheet and close
    oSheet = null;
    oRange = null;
    oWB.SaveAs(“test.xls”, Excel.XlFileFormat.xlWorkbookNormal,
    Missing.Value, Missing.Value, Missing.Value, Missing.Value,
    Excel.XlSaveAsAccessMode.xlExclusive,
    Missing.Value, Missing.Value, Missing.Value,
    Missing.Value, Missing.Value);
    oWB.Close(Missing.Value, Missing.Value, Missing.Value);
    oWB = null;
    oXL.Quit();
    // Clean up
    // NOTE: When in release mode, this does the trick
    GC.WaitForPendingFinalizers();
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
}
 IrishChieftain06 февр. 2012 г., 18:29
Не хочу использовать Interop. Можно ли взять пример 1 и исключить Gridview из смеси - просто перенести данные из БД в Excel?
 rofans9103 февр. 2012 г., 01:10
Хорошо, братан, спокойной ночи. Все 3 метода работают. Просто выберите 1. :)
 IrishChieftain03 февр. 2012 г., 01:04
Спасибо, завтра попробую и вернусь :)
 rofans9107 февр. 2012 г., 05:17
конечно, возможно ..
 Ashok31 мар. 2017 г., 23:41
@ rofans91 Большое спасибо за спасение моего дня. Можно ли выделить заголовок файла Excel для лучшего вида?

Ваш ответ на вопрос