Word のコンテンツコントロールを利用したサンプル C#版
[今日のみちしるべ 第7回 己の敵は過去の自分]
なんだか、漢(オトコ)っぽいタイトルですが、(漢と書いてオトコと読む!どこかの漫画で聞いたフレーズですが。笑)
ここでいう、己とは、私が担当している製品の Office の事です。
Microsoft の Office の最大、最強の敵は何でしょうか?
最近、取りざたされている OpenOffice でしょうか?それとも、Google Apps?
いえ、違います。最大の敵は過去の Office です。ここでいう過去の Office とは 2003 のことになります。
これはよく社内で取り上げられていることでもあり、目新しい言葉ではないのですが、本屋さんで、まざまざと現実を見せつけられました。
IT 関連の書籍で毎月、ベスト 5 に入るのが、Windows XP の使い方と Excel 2003 の使い方だそうです。
本屋さん的には売れ筋ということで、IT 関連の本のコーナーにはたくさんの XP や Excel 2003 に関連する書籍があります。
特に IT 関連の本で一番多いのは、Excel の本です。しかも、Excel 2003 ベースのものがほとんどです。
つまり、Excel はとても使われているけど、以前のバージョンのものが、今、一番使われていて、その製品をサポートするための書籍で一番売れているものは、一つ前のバージョンだということを意味しています。
頭やデータでは理解していましたが、本屋さんに行って、IT 書籍のコーナーを見て、現実を知りました。
新しい、Office は非常に使いやすくなっています。Excel も分析ツールとしての飛躍的な機能向上とデータの見やすさ、操作性の向上は過去のバージョンの比ではありません。
最近は使っていただけるお客様が増えてきているのですが、「使ってみるといいね」という声も多く聞かれます。
ただ、使っていただけてないというのは我々の責任であり、もっと、使っていただけるような訴求方法を考えないといけないのかもしれません。
そして、これだけ、空気や水のように使われている大事な存在である Excel をさらに次の世界へ導いてくれるツールとして、VSTO があるのだと思います。
VSTO 関連の書籍も書店に増えていけば、さらに広まるとは思うのですが、どなたか、このブログを見ている方が書いていただけないかなあと思っております。(私も協力は惜しみません。)
もしくは、私も何冊か書いて、VSTO を Office 開発のスタンダードにしていきたいと思っています。
[本題]
今回は表題の件の C# 版の公開です。
VB 版は以下でご紹介させていただきました。
デザイナやデータソースの扱い、Word テンプレートの読み込みなどは一緒です。
コード部分のみ、C# でご確認ください。
コメントや説明は VB 版で説明しておりますので、割愛しております。
また、サンプルも添付いたしますので、試してみてください。
必要なデータベースは SQL Server サンプルデータベースの Northwind になります。
Northwind は必要に応じて、ここからダウンロードしてみてください。
起動時の画面:
作業ウィンドウの操作でデータの挿入:
ActionControl.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ShipmentForm
{
public partial class ActionControl : UserControl
{
public ActionControl()
{
InitializeComponent();
}
private void ActionControl_Load(object sender, EventArgs e)
{
this.customersTableAdapter.Fill(northwindDataSet.Customers);
this.suppliersTableAdapter.Fill(northwindDataSet.Suppliers);
this.productsTableAdapter.Fill(northwindDataSet.Products);
}
private void btnCustomer_Click(object sender, EventArgs e)
{
AddDataClass AddData = new AddDataClass(companyNameTextBox.Text,
contactNameTextBox.Text,
postalCodeTextBox.Text,cityTextBox.Text,
addressTextBox.Text,phoneTextBox.Text,faxTextBox.Text);
}
private void AddData(DataRow row, string companyName)
{
object missing = System.Type.Missing;
Microsoft.Office.Interop.Word.Selection selection =
Globals.ThisDocument.Application.Selection;
if (selection.Tables.Count > 0)
{
Microsoft.Office.Interop.Word.Row newrow =
Globals.ThisDocument.Tables[4].Rows.Add(ref missing);
newrow.Range.Font.Bold = 0;
newrow.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.
WdParagraphAlignment.wdAlignParagraphLeft;
newrow.Cells[4].Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.
WdParagraphAlignment.wdAlignParagraphRight;
newrow.Cells[1].Range.Text = companyName;
newrow.Cells[2].Range.Text = row["ProductName"].ToString();
newrow.Cells[3].Range.Text = row["QuantityPerUnit"].ToString();
newrow.Cells[4].Range.Text = Math.Round(Convert.ToDouble(row["UnitPrice"])).ToString();
}
else
{
MessageBox.Show("カーソルをテーブルの中に入れてください。",
"Action Pane",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
private void btnForm_Click(object sender, EventArgs e)
{
DataTable tbl = northwindDataSet.Products;
DataRow[] rows;
if (this.productNameListBox.SelectedIndex >= 0)
{
DataRowView productrow = (System.Data.DataRowView)
this.productNameListBox.SelectedItem;
string product = productrow.Row["ProductName"].ToString();
string company = this.companyNameComboBox.Text;
rows = tbl.Select("ProductName = '" + product.Replace("'", "''") + "'");
this.AddData(rows[0], company);
}
else
{
MessageBox.Show("商品を選択してください。", "Action Pane", MessageBoxButtons.OK);
}
}
}
}
AddDataClass.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Tools.Word;
namespace ShipmentForm
{
class AddDataClass
{
public AddDataClass(string CompanyNameTextBox, string ContactNameTextBox,
string PostalCodeTextBox, string CityTextBox, string AddressTextBox,
string PhoneTextBox, string FaxTextBox)
{
//発送先会社名
PlainTextContentControl CompanyNameAdd = Globals.ThisDocument.plainTextContentControl1;
CompanyNameAdd.Text = CompanyNameTextBox;
//発送先担当者名
PlainTextContentControl ContactNameAdd = Globals.ThisDocument.plainTextContentControl2;
ContactNameAdd.Text = ContactNameTextBox;
//郵便番号
PlainTextContentControl PostalCodeAdd = Globals.ThisDocument.plainTextContentControl3;
PostalCodeAdd.Text = PostalCodeTextBox;
//住所1(City)
PlainTextContentControl CityAdd = Globals.ThisDocument.plainTextContentControl4;
CityAdd.Text = CityTextBox;
//住所2(Address)
PlainTextContentControl AddressAdd = Globals.ThisDocument.plainTextContentControl5;
AddressAdd.Text = AddressTextBox;
//電話番号
PlainTextContentControl PhoneAdd = Globals.ThisDocument.plainTextContentControl6;
PhoneAdd.Text = PhoneTextBox;
//FAX
PlainTextContentControl FaxAdd = Globals.ThisDocument.plainTextContentControl7;
FaxAdd.Text = FaxTextBox;
}
}
}
ThisDocument.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
using Office = Microsoft.Office.Core;
using Word = Microsoft.Office.Interop.Word;
namespace ShipmentForm
{
public partial class ThisDocument
{
private ActionControl actions = new ActionControl();
private void ThisDocument_Startup(object sender, System.EventArgs e)
{
Globals.ThisDocument.ActionsPane.Controls.Add(actions);
}
private void ThisDocument_Shutdown(object sender, System.EventArgs e)
{
}
}
}
サンプルのダウンロードはこちらから。