C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: excelのセルの書き換え方がわかりません


(過去ログ 115 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■67543 / inTopicNo.1)  excelのセルの書き換え方がわかりません
  
□投稿者/ 裕猫 (61回)-(2013/08/08(Thu) 16:26:11)

分類:[C#] 

開発環境
OS: Windows7
言語: VisualStudio2008 C#
EXCEL2000

 EXCEL2000にMicrosoft.Jet.OLEDB.4.0を使って接続し、ODBCを使ってA,Bのデータを読みAのデータによりBのセルを書き変えたいのですが、書き換えと保存の仕方がわかりません。接続して、行データを1行づつ読み込むところまではできました。
 2013TEST.xlsに接続し、一覧表というシートの中を開きA,B列をAの1文字目が0の物はBに★を入れそれ以外の物は空白にして上書き保存したいのですが、

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using DBS;
using TIPS;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string sCS = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=2013TEST.xls;Extended Properties=Excel 8.0";
            OleDbConnection oleConn = new OleDbConnection(sCS);
            OleDbCommand oleCmd = new OleDbCommand();
            OleDbDataReader oleReader;

            oleConn.Open();
            oleCmd.Connection = oleConn;
            oleCmd.CommandText = "SELECT * FROM [一覧表$]";

            oleReader = oleCmd.ExecuteReader();
            while (oleReader.Read())
            {
                string[] OKL = new string[2];
                for (int CT1 = 0; CT1 < 2; CT1++) { OKL[CT1] = oleReader[CT1].ToString(); }
                if (OLK[0].substring(0, 1) == "0") 
                {
                      //B = ★;   --------------------------ここでBのセルを書き換える書き方がわかりません。
                 }
                 else
                 {
                     //B = " ";   --------------------------ここでBのセルを書き換える書き方がわかりません。
                 }
            }
     //-----------------------------------------ここで保存変更すると思いますが書き方がわかりません。
            oleReader.Close();
            oleConn.Close();
        }
    }
}
excel2007ではCOM相互運用を使ってできているのですが、実機はexcel2000なのでMicrosoft.Jet.OLEDB.4.0とoledbでやらなければならず、いろいろ調べているのですが解決できなくて困っております。
よろしくお願いいたします。

引用返信 編集キー/
■67547 / inTopicNo.2)  Re[1]: excelのセルの書き換え方がわかりません
□投稿者/ 魔界の仮面弁士 (300回)-(2013/08/08(Thu) 19:12:53)
No67543 (裕猫 さん) に返信
> 開発環境
> OS: Windows7
> 言語: VisualStudio2008 C#
> EXCEL2000

Office 2000 は、Vista や Win7 に対応していません。
(もっとも、Office XP 以下のバージョンのサポートは終了していますが…)

http://answers.microsoft.com/ja-jp/office/forum/officeversion_other-office_install/windows-7/e4d20440-8921-42e2-b1f2-b7fa884643aa
http://www.microsoft.com/ja-jp/office/platform.aspx


> oleCmd.CommandText = "SELECT * FROM [一覧表$]";
FROM [一覧表$A1:B9] みたいな指定も可能ですね。


> 書き換えと保存の仕方がわかりません。
UPDATE クエリーで編集できます。下記が参考になるかと。
http://support.microsoft.com/kb/316934/ja

カーソル処理したいのだとしたら、ADO.NET 経由では行えませんので、
RDO、DAO、ADODB、ODBC-API などを利用する必要があります。


> 実機はexcel2000なので
遅延バインディングすれば、参照設定せずとも呼び出せますよ。
http://support.microsoft.com/kb/302902/ja

上記のサンプルは COM 解放を考慮していないので、そこは適宜修正してください。

これが C# 2010 なら dynamic を使ってもっとスッキリ書けるのですけれどね…。
あるいは処理速度を重視しないなら、Microsoft.VisualBasic.dll 経由で
CallByName する手もあります。


> Microsoft.Jet.OLEDB.4.0とoledbでやらなければならず
NPOI 使うとか。
http://npoi.codeplex.com/

無償ではなく、メーカーサポートの効く有償製品が良いのなら、
SpreadsheetGear や ExcelCreator といった製品もあります。
引用返信 編集キー/
■67549 / inTopicNo.3)  Re[2]: excelのセルの書き換え方がわかりません
□投稿者/ 裕猫 (62回)-(2013/08/09(Fri) 09:42:37)
No67547 (魔界の仮面弁士 さん) に返信
>>書き換えと保存の仕方がわかりません。
> UPDATE クエリーで編集できます。下記が参考になるかと。
> http://support.microsoft.com/kb/316934/ja
ここは見ていたのですがF1 F2の意味が理解きませんでした。

> カーソル処理したいのだとしたら、ADO.NET 経由では行えませんので、
> RDO、DAO、ADODB、ODBC-API などを利用する必要があります。
カーソル処理は必要ないです。

>>実機はexcel2000なので
> 遅延バインディングすれば、参照設定せずとも呼び出せますよ。
> http://support.microsoft.com/kb/302902/ja
ここの方法はいいですね。OFFICE2007で覚えた方法が応用できそうです。
この遅延バインディングを使用してやってみようと思います。
これから遅延バインディングについて調べてやってみます。
ありがとうございました。
引用返信 編集キー/
■67554 / inTopicNo.4)  Re[3]: excelのセルの書き換え方がわかりません
□投稿者/ 魔界の仮面弁士 (301回)-(2013/08/09(Fri) 11:44:01)
No67549 (裕猫 さん) に返信
>>UPDATE クエリーで編集できます。下記が参考になるかと。
>>http://support.microsoft.com/kb/316934/ja
> ここは見ていたのですがF1 F2の意味が理解きませんでした。

列名です。下記のような説明が書かれていたハズですが、分かりにくかったでしょうか?
---------
 接続文字列に HDR=NO と指定すると、Jet OLE DB プロバイダによって
 フィールドに自動的に名前が付けられます 
 (最初のフィールドは F1、2 番目のフィールドは F2 など)。
---------

F1、F2 は、それぞれ第一列、第二列の意味です。
Jet の ISAM ドライバは、無名列に対して Fn 形式の名前を付けます。

先頭行を列名と見なすかどうかは、接続パラメータにて切り替えられます。
 「;Extended Properties="Excel 8.0;HDR=YES";」
 「;Extended Properties="Excel 8.0;HDR=NO";」


ただし JET 経由での操作の場合は、データ型判定に失敗することがあります。
http://hanatyan.sakura.ne.jp/vbhlp/dao_002.htm
http://support.microsoft.com/kb/194124/ja

読込専用なら IMEX=1 を指定することで誤判定に対処できますが、
編集目的では使えないため、その点は注意が必要です。


> カーソル処理は必要ないです。
提示いただいたコードがループ処理だったので、てっきり
カーソル制御が必要なのかと思ってしまいました。(^^;



> ここの方法はいいですね。OFFICE2007で覚えた方法が応用できそうです。
バージョンが変わるとメソッド定義が変わるので気を付けてください。

省略可能な引数が追加されて引数の数が増えているパターンなどもあるためです。
(C#2010 以降や VBScript 等であれば、このあたりは気にせず済みますが…)

有名どころとしては、このあたり。

/* Workbooks.Open メソッド */
HRESULT Open(
    [in] BSTR Filename, 
    [in, optional] VARIANT UpdateLinks, 
    [in, optional] VARIANT ReadOnly, 
    [in, optional] VARIANT Format, 
    [in, optional] VARIANT Password, 
    [in, optional] VARIANT WriteResPassword, 
    [in, optional] VARIANT IgnoreReadOnlyRecommended, 
    [in, optional] VARIANT Origin, 
    [in, optional] VARIANT Delimiter, 
    [in, optional] VARIANT Editable, 
    [in, optional] VARIANT Notify, 
    [in, optional] VARIANT Converter, 
    [in, optional] VARIANT AddToMru,
#if ExcelVER >= 2002
    [in, optional] VARIANT Local, 
    [in, optional] VARIANT CorruptLoad, 
#endif
    [in, lcid] long lcid, 
    [out, retval] Workbook** RHS);


/* Workbooks.OpenText メソッド */
HRESULT OpenText(
    [in] BSTR Filename, 
    [in, optional] VARIANT Origin, 
    [in, optional] VARIANT StartRow, 
    [in, optional] VARIANT DataType, 
    [in, optional, defaultvalue(1)] XlTextQualifier TextQualifier, 
    [in, optional] VARIANT ConsecutiveDelimiter, 
    [in, optional] VARIANT Tab, 
    [in, optional] VARIANT Semicolon, 
    [in, optional] VARIANT Comma, 
    [in, optional] VARIANT Space, 
    [in, optional] VARIANT Other, 
    [in, optional] VARIANT OtherChar, 
    [in, optional] VARIANT FieldInfo, 
    [in, optional] VARIANT TextVisualLayout, 
#if ExcelVER >= 97
    [in, optional] VARIANT DecimalSeparator, 
    [in, optional] VARIANT ThousandsSeparator, 
#endif
#if ExcelVER >= 2002
    [in, optional] VARIANT TrailingMinusNumbers, 
    [in, optional] VARIANT Local, 
#endif
    [in, lcid] long lcid);



この他、以前は戻り値の無かったメソッド(Sub)が、戻り値あり(Function)になる場合もあるので、
レイトバインドにする場合は、それぞれのバージョンのタイプライブラリの違いを、
充分に調査しておく必要があります。



> これから遅延バインディングについて調べてやってみます。
ついでに、COM 解放についても。

http://jeanne.wankuma.com/tips/csharp/programming/releasecom.html
http://support.microsoft.com/kb/317109/en-us

引用返信 編集キー/
■67721 / inTopicNo.5)  Re[4]: excelのセルの書き換え方がわかりません
□投稿者/ 裕猫 (63回)-(2013/08/27(Tue) 13:42:04)
2013/08/28(Wed) 10:38:47 編集(投稿者)

遅延バインディングにて動作ができました。ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -