0

asp.netアプリケーションのExcelシートへのエクスポートとインポートにFollowin LOCを使用しています

 protected void LinkbuttonExportToExcel_Click(object sender, EventArgs e)
{
    UserManager manager = new UserManager();
    DataSet dataSet = manager.GetProductDataToExport();

    string attachment = "attachment; filename=Report.xls";
    Response.ClearContent();
    Response.AddHeader("content-disposition", attachment);
    Response.ContentType = "application/vnd.ms-excel";
    string tab = "";
    string tab1 = "";
    foreach (DataTable table in dataSet.Tables)
    {
        foreach (DataColumn column in table.Columns)
        {
           Response.Write(tab1 + column.ColumnName);
           tab1 = "\t";
        }
    }
    tab = "\n";
        foreach (DataRow dr in dataSet.Tables[0].Rows)
    {
       for (int i = 0; i < dataSet.Tables[0].Columns.Count; i++)
        {
          Response.Write(tab + dr[i].ToString());
          tab = "\t";
        }
        tab = "\n";
    }
    Response.End();
}

protected void ButtonImportDataFromExcel_Click(object sender, EventArgs e)
{
    FileUpload1.PostedFile.SaveAs(Server.MapPath("~/App_Data/ProductImport.xls"));
    OleDbConnection objXConn = new OleDbConnection();
    objXConn.ConnectionString = ConfigurationManager.ConnectionStrings["sqlXCon"].ConnectionString;
   if (objXConn.State == ConnectionState.Closed)
    {
        objXConn.Open();
    }

        DataTable dt = new DataTable();
        dt = objXConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
        string excelSheetName = string.Empty; ;
        foreach (DataRow row in dt.Rows)
        {
          excelSheetName = row["TABLE_NAME"].ToString();
        }
        OleDbCommand cmd = new OleDbCommand("SELECT * FROM [" +  excelSheetName + "]", objXConn);
        OleDbDataReader rd = cmd.ExecuteReader();
        UserManager manager = new UserManager();

        while (rd.Read())
        {
            int productId = int.Parse((rd.GetValue(0).ToString()));
            string productName = (rd.GetValue(1).ToString());
            string productNameHindi = (rd.GetValue(2).ToString());
            decimal productPrice = decimal.Parse((rd.GetValue(3).ToString()));
            string productStatus = (rd.GetValue(4).ToString());
            manager.UpdateProductMasterFromExcelSheet(productId, productName);
        }
    }
    else
    {
        objXConn.Close();
    }
    msgBox1.alert("Products updated successfully");
}

}

私は次の接続文字列を使用しています..

<add name="sqlXCon" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source='|DataDirectory|ProductImport.xls';Extended Properties='Excel 8.0;HDR=YES;IMEX=1;';" />

ファイル Report.xls が正常にエクスポートされます。しかし、問題は、ファイルを開いて再度 .xls として保存しない限り、「Report.xls」をインポートできないことです。なぜこれが起こっているのですか?

4

3 に答える 3

2

詳細については、Excel InterOp を参照してください。このサイトを参照してください..

Excel.Interop

于 2012-08-11T08:38:32.247 に答える
0

Excel Libraray を使用し、http: //code.google.com/p/excellibrary/downloads/list からダウンロードします。

using System;
using System.Data;
using System.IO;
 using ExcelLibrary.SpreadSheet;

 namespace ExcelLibrary
 {
 /// <summary>
 /// Provides simple way to convert Excel workbook into DataSet
 /// </summary>
 public sealed class DataSetHelper
 {
/// <summary>
/// Populate all data (all converted into String) in all worksheets 
/// from a given Excel workbook.
/// </summary>
/// <param name="filePath">File path of the Excel workbook</param>
/// <returns>DataSet with all worksheet populate into DataTable</returns>
public static DataSet CreateDataSet(String filePath)
{
    DataSet ds = new DataSet();
    Workbook workbook = Workbook.Load(filePath);
    foreach (Worksheet ws in workbook.Worksheets)
    {
        DataTable dt = PopulateDataTable(ws);
        ds.Tables.Add(dt);
    }
    return ds;
}

/// <summary>
/// Populate data (all converted into String) from a given Excel 
/// workbook and also work sheet name into a new instance of DataTable.
/// Returns null if given work sheet is not found.
/// </summary>
/// <param name="filePath">File path of the Excel workbook</param>
/// <param name="sheetName">Worksheet name in workbook</param>
/// <returns>DataTable with populate data</returns>
public static DataTable CreateDataTable(String filePath, String sheetName)
{
    Workbook workbook = Workbook.Load(filePath);
    foreach (Worksheet ws in workbook.Worksheets)
    {
        if (ws.Name.Equals(sheetName))
            return PopulateDataTable(ws);
    }
    return null;
}

private static DataTable PopulateDataTable(Worksheet ws)
{
    CellCollection Cells = ws.Cells;

    // Creates DataTable from a Worksheet
    // All values will be treated as Strings
    DataTable dt = new DataTable(ws.Name);

    // Extract columns
    for (int i = 0; i <= Cells.LastColIndex; i++)
        dt.Columns.Add(Cells[0, i].StringValue, typeof(String));

    // Extract data
    for (int currentRowIndex = 1; currentRowIndex <= Cells.LastRowIndex; currentRowIndex++)
    {
        DataRow dr = dt.NewRow();
        for (int currentColumnIndex = 0; currentColumnIndex <= Cells.LastColIndex; currentColumnIndex++)
            dr[currentColumnIndex] = Cells[currentRowIndex, currentColumnIndex].StringValue;
        dt.Rows.Add(dr);
    }

    return dt;
}

/// <summary>
/// Populate all data from the given DataSet into a new Excel workbook
/// </summary>
/// <param name="filePath">File path to new Excel workbook to be created</param>
/// <param name="dataset">Source DataSet</param>
public static void CreateWorkbook(String filePath, DataSet dataset)
{
    if (dataset.Tables.Count == 0)
        throw new ArgumentException("DataSet needs to have at least one DataTable", "dataset");

    Workbook workbook = new Workbook();
    foreach (DataTable dt in dataset.Tables)
    {
        Worksheet worksheet = new Worksheet(dt.TableName);
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            // Add column header
            worksheet.Cells[0, i] = new Cell(dt.Columns[i].ColumnName);

            // Populate row data
            for (int j = 0; j < dt.Rows.Count; j++)
                worksheet.Cells[j + 1, i] = new Cell(dt.Rows[j][i]);
        }
        workbook.Worksheets.Add(worksheet);
    }
    workbook.Save(filePath);
}
 }
}
于 2012-07-13T07:31:14.290 に答える
0

これが発生する理由は、実際には Excel ファイルをエクスポートしていないためです。 LinkbuttonExportToExcel_Click は、Excel で開くことができるタブ区切りの値ファイルを生成しますが、Excel ファイルではありません。

一方、ButtonImportDataFromExcel_Click 関数は Excel ファイルから読み取ります (TSV ではなく、実際の Excel ファイルである必要があります)。

そのため、実際には手動で開き、再度保存して xls として変換する必要があります。

そのために、サーバーに Excel がある場合は Excel.Interop を使用して Excel ファイルを生成するか、オープン ソース ライブラリを使用して Excel ファイルを生成することができます。

于 2012-07-13T07:34:32.460 に答える