0

現在、Excelスプレッドシートで次のコードを開いて読み取っています。

var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 12.0;", fileNameTextBox.Text);
var queryString = String.Format("SELECT * FROM [{0}]",DETAILS_SHEET_NAME);
var adapter = new OleDbDataAdapter(queryString, connectionString);
var ds = new DataSet();

adapter.Fill(ds, DETAILS_SHEET_NAME);

DataTable data = ds.Tables[DETAILS_SHEET_NAME];

dataGridView1.DataSource = data;
                dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);

ワークシートの最初の行 (行 2 がヘッダーであるため、おそらく最初の 2 行) に興味がないことを除いて、これはすべて問題ありません。選択クエリを変更して、Excel のように範囲を選択するにはどうすればよいですか?

データを含む 2 以降のすべての行の列 AN を読むことに興味があります。

また、別のワークシートのいくつかの特定のセルにアクセスする必要があります。これらのセルごとに異なるクエリ文字列を使用して別のアダプターを作成する必要があると思いますか?

4

2 に答える 2

2

次の例のように、Selectワイルドカードの代わりに必要な列だけを含むステートメントを変更します。"*"

("SELECT Column1, Column2 FROM DETAILS_SHEET_NAME");

不要な行を削除するために追加のロジックを適用できます。たとえば、次のような「ページング ソリューション」(N から M までの行を選択する) などがあります。

データベース テーブル "TBL_ITEM" に、関心のある 2 つの列 (フィールド) が含まれていると仮定します。一意の ID を表す "Item" 列と、昇順での並べ替えに使用される "Rank" 列です。一般的なページングの問題は次のように表されます。 -ランク オフセット (つまり、スキップ) (MN) 行によって並べ替えられたテーブルの行:

SELECT TOP N Item, 
Rank FROM (SELECT TOP M Rank, Item FROM TBL_ITEM ORDER BY Rank) 
AS [SUB_TAB] ORDER BY Rank DESC 

このソリューションとその拡張機能/サンプルについては、私の記事Pure SQL solution to Database Table Paging (リンク: http://www.codeproject.com/Tips/441079/Pure-SQL-solution-to-Database-Table-Paging ) で詳しく説明しています。 )

最後に、以下のリスト 2 に示すコード スニペットを使用して、DataTable オブジェクトのコンテンツを Excel ファイルにエクスポートし、コードに追加できるカスタマイズ機能を多数追加できます。

リスト 2. DataTable を Excel ファイルにエクスポート (2007/2010):

internal static bool Export2Excel(DataTable dataTable, bool Interactive) 
{
    object misValue = System.Reflection.Missing.Value;

    // Note: don't include Microsoft.Office.Interop.Excel in reference (using),
    // it will cause ambiguity w/System.Data: both have DataTable obj
    Microsoft.Office.Interop.Excel.Application _appExcel = null;
    Microsoft.Office.Interop.Excel.Workbook _excelWorkbook = null;
    Microsoft.Office.Interop.Excel.Worksheet _excelWorksheet = null;
    try
    {
        // excel app object
        _appExcel = new Microsoft.Office.Interop.Excel.Application();

        // make it visible to User if Interactive flag is set
        _appExcel.Visible = Interactive;

        // excel workbook object added to app
        _excelWorkbook = _appExcel.Workbooks.Add(misValue);

        _excelWorksheet = _appExcel.ActiveWorkbook.ActiveSheet 
            as Microsoft.Office.Interop.Excel.Worksheet;

        // column names row (range obj)
        Microsoft.Office.Interop.Excel.Range _columnsNameRange;
        _columnsNameRange = _excelWorksheet.get_Range("A1", misValue);
        _columnsNameRange = _columnsNameRange.get_Resize(1, dataTable.Columns.Count);

        // data range obj
        Microsoft.Office.Interop.Excel.Range _dataRange;
        _dataRange = _excelWorksheet.get_Range("A2", misValue);
        _dataRange = _dataRange.get_Resize(dataTable.Rows.Count, dataTable.Columns.Count);

        // column names array to be assigned to columnNameRange
        string[] _arrColumnNames = new string[dataTable.Columns.Count];

        // 2d-array of data to be assigned to _dataRange
        string[,] _arrData = new string[dataTable.Rows.Count, dataTable.Columns.Count];

        // populate both arrays: _arrColumnNames and _arrData
        // note: 2d-array structured as row[idx=0], col[idx=1]
        for (int i = 0; i < dataTable.Columns.Count; i++)
        {
            for (int j = 0; j < dataTable.Rows.Count; j++)
            {
                _arrColumnNames[i] = dataTable.Columns[i].ColumnName;
                _arrData[j, i] = dataTable.Rows[j][i].ToString();
            }
        }

        //assign column names array to _columnsNameRange obj
        _columnsNameRange.set_Value(misValue, _arrColumnNames);

        //assign data array to _dataRange obj
        _dataRange.set_Value(misValue, _arrData);

        // save and close if Interactive flag not set
        if (!Interactive)
        {
            // Excel 2010 - "14.0"
            // Excel 2007 - "12.0"
            string _ver = _appExcel.Version;

            string _fileName ="TableExport_" + 
                DateTime.Today.ToString("yyyy_MM_dd") + "-" +
                DateTime.Now.ToString("hh_mm_ss");

            // check version and select file extension
            if (_ver == "14.0" || _ver == "12.0")  { _fileName += ".xlsx";}
            else { _fileName += ".xls"; }

            // save and close Excel workbook
            _excelWorkbook.Close(true, "{DRIVE LETTER}:\\" + _fileName, misValue);
        }
        return true;
    }
    catch (Exception ex) {  throw; }
    finally
    {
        // quit excel app process
        if (_appExcel != null)
        {
            _appExcel.UserControl = false;
            _appExcel.Quit();
            _appExcel = null;
            misValue = null;
        }
    }
}
于 2013-05-10T16:34:39.967 に答える
0

ヘッダーなしを要求するだけです。接続文字列を変更し、 を追加しHDR=Noます。

2 番目の問題については、この投稿を見つけました。参考になるかもしれません。

于 2013-05-10T16:36:59.223 に答える