D:\Documents\Visual Studio 2015\Projects\MyHomePage用サンプル\ExcelAndWord\ExcelAndWord\MainForm.cs 1 /* ExcelやWordとやりとりする 2015.9.19~9,20 仕様 ・Excelの場合は、処理メニュー選択用の新しいフォームを開き、この実行ファイルと同じフォルダにある「test.xlsb」を開き、主に単独のセ ルやセル範囲に値を書き込む処理をいろいろテストする。 ・Wordの場合は、処理メニュー選択用の新しいフォームを開き、この実行ファイルと同じフォルダにある「test.docx」を開き、文章を追加し てフォントの大きさを変えたり、センタリングしたり、表を追加し、文字を書き込んだりする。 準備 あらかじめ、Visual Studioのメニューバーから 「プロジェクト」→「参照の追加」で出てくる「参照マネージャー」で
「COM」タブから「Microsoft Excel 15.0 Object Libraly」と「Microsoft Word 15.0 Object Library」の 2つにチェックを入れ、「OK」をクリックして、 参照設定を有効にしておく(Office 2013の場合)。 */ using Microsoft.Office.Interop.Excel; using Microsoft.Office.Interop.Word; using System; using System.IO; using System.Windows.Forms; namespace ExcelAndWord {
public partial class MainForm : Form { public MainForm() { InitializeComponent(); } // Excel, Wordのインスタンス作成
internal Microsoft.Office.Interop.Excel.Application appExcel = new Microsoft.Office.Interop.Excel.Application(); internal Microsoft.Office.Interop.Word.Application appWord = new Microsoft.Office.Interop.Word.Application(); internal Workbook WB;
D:\Documents\Visual Studio 2015\Projects\MyHomePage用サンプル\ExcelAndWord\ExcelAndWord\MainForm.cs 2 private void MainForm_Load(object sender, EventArgs e)
{
// Excel, Wordをいったんは非表示にしておく。こうするとタスクバーにも表示されない。 appExcel.Visible = false;
WB = appExcel.Workbooks.Open(Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + @"\test.xlsb"); appWord.Visible = false;
DOC = appWord.Documents.Open(Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + @"\test.docx"); }
private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { try { WB.Close(false); appExcel.Quit(); }
catch (Exception ex) { MessageBox.Show("ワークシートは既に閉じられています"); } try { DOC.Close(false); appWord.Quit(); }
catch (Exception ex) {
MessageBox.Show("文書は既に閉じられています"); }
}
private void btnExcel_Click(object sender, EventArgs e) {
// Excelの操作メニューを開く
var ExcelForm = new ControlExcel();
D:\Documents\Visual Studio 2015\Projects\MyHomePage用サンプル\ExcelAndWord\ExcelAndWord\MainForm.cs 3 private void btnWord_Click(object sender, EventArgs e)
{
// Wordの操作メニューを開く var WordForm = new ControlWord();
WordForm.mfm = this; // ExcelFormの変数mfmにこのフォームへの参照を代入しておく WordForm.ShowDialog();
} } }
D:\Documents\Visual Studio 2015\Projects\MyHomePage用サンプル\ExcelAndWord\ExcelAndWord\ControlExcel.cs 1 /* Excelのコントロールをする */ using Microsoft.Office.Interop.Excel; using System; using System.Windows.Forms; namespace ExcelAndWord {
public partial class ControlExcel : Form {
public ControlExcel() {
InitializeComponent(); }
internal MainForm mfm; // このフォームが開いたとき、この変数で呼んだMainFormへの参照を受け取る Worksheet WS;
private void ControlExcel_Load(object sender, EventArgs e) {
chkDispExcel.Checked = true; // 初期状態ではExcelは見えるようにしておく }
private void chkDispExcel_CheckedChanged(object sender, EventArgs e) {
mfm.appExcel.Visible = chkDispExcel.Checked ? true : false; // チェックボックスが切り替わるたびにExcelの可視、不可視を 切り替える
}
// セルに値を書き込むときの基本コード
private void btnA1_Click(object sender, EventArgs e) {
WS = mfm.WB.Worksheets.Add(After: mfm.WB.Worksheets[mfm.WB.Worksheets.Count]); // 名前つき引数を使うことにより、余分な カンマを使わずに済む
D:\Documents\Visual Studio 2015\Projects\MyHomePage用サンプル\ExcelAndWord\ExcelAndWord\ControlExcel.cs 2 // セル範囲A1:J20のセル1個1個にデータを書き込む(途中の処理経過を見せる)(速度がもっとも遅い)
private void btnA1J20CellScreenUpdatingTrue_Click(object sender, EventArgs e) { WS = mfm.WB.Worksheets.Add(After: mfm.WB.Worksheets[mfm.WB.Worksheets.Count]); for (var r = 1; r <= 20; r++) for (var c = 1; c <= 10; c++) WS.Cells[r, c].Value = (r - 1) * 10 + c; } // セル範囲A1:J20のセル1個1個にデータを書き込む(途中の処理経過を見せない)(速度がやや改善) private void btnA1J20CellScreenUpdatingFalse_Click(object sender, EventArgs e)
{ WS = mfm.WB.Worksheets.Add(After: mfm.WB.Worksheets[mfm.WB.Worksheets.Count]); mfm.appExcel.Application.ScreenUpdating = false; for (var r = 1; r <= 20; r++) for (var c = 1; c <= 10; c++) WS.Cells[r, c].Value = (r - 1) * 10 + c; mfm.appExcel.Application.ScreenUpdating = true; } // 結果的には上と同じになるが、まずは書き込むべきデータを配列に用意しておき、セル範囲A1:J20に一挙に書き込む(もっとも速 い)
private void btnA1J20Array_Click(object sender, EventArgs e) {
WS = mfm.WB.Worksheets.Add(After: mfm.WB.Worksheets[mfm.WB.Worksheets.Count]); var buf = new object[20, 10];
for (var r = 0; r < 20; r++) for (var c = 0; c < 10; c++) buf[r, c] = r * 10 + (c + 1); WS.Range["A1:J20"].Value = buf; } } }
D:\Documents\Visual Studio 2015\Projects\MyHomePage用サンプル\ExcelAndWord\ExcelAndWord\ControlWord.cs 1 /* Wordのコントロールをする */ using Microsoft.Office.Interop.Word; using System; using System.Windows.Forms; namespace ExcelAndWord {
public partial class ControlWord : Form {
public ControlWord() {
InitializeComponent(); }
internal MainForm mfm; // このフォームが開いたとき、この変数で呼んだMainFormへの参照を受け取る private void ControlWord_Load(object sender, EventArgs e)
{
chkDispWord.Checked = true; // 初期状態ではWordは見えるようにしておく }
private void chkDispWord_CheckedChanged(object sender, EventArgs e) {
mfm.appWord.Visible = chkDispWord.Checked ? true : false; // チェックボックスが切り替わるたびにExcelの可視、不可視を切 り替える
}
private void btnGo_Click(object sender, EventArgs e) {
var myDoc = mfm.DOC;
// 文書の先頭に「ワード文書テスト」という文章を挿入し、大きさを20ptにし、センタリングする myDoc.Range(0, 0).InsertAfter("ワード文書テスト\n");
D:\Documents\Visual Studio 2015\Projects\MyHomePage用サンプル\ExcelAndWord\ExcelAndWord\ControlWord.cs 2 // 1行空ける。その際、フォントサイズを10.5ptに戻し、文字位置も両端ぞろえに戻す。 myDoc.Content.InsertParagraphAfter(); myDoc.Paragraphs[2].Range.Font.Size = 10.5f; myDoc.Paragraphs[2].Alignment = WdParagraphAlignment.wdAlignParagraphJustify; // 3×4型の表を挿入し、適当に文字を入れる。表の罫線は表を挿入しただけでは、印刷時に非表示となる。 var tbl1 = myDoc.Tables.Add(myDoc.Range(myDoc.Content.StoryLength - 1), 3, 4); tbl1.Cell(1, 1).Range.Text = "1行1列目"; tbl1.Cell(2, 3).Range.Text = "2行3列目"; // 1行空ける。 myDoc.Content.InsertParagraphAfter(); // 2×3の表を挿入する。今度は表の罫線をフォーマットする。 var tbl2 = myDoc.Tables.Add(myDoc.Range(myDoc.Content.StoryLength - 1), 2, 3); tbl2.Borders.OutsideLineStyle = WdLineStyle.wdLineStyleSingle; tbl2.Borders.OutsideLineWidth = WdLineWidth.wdLineWidth150pt; tbl2.Borders.InsideLineStyle = WdLineStyle.wdLineStyleSingle; tbl2.Borders.InsideLineWidth = WdLineWidth.wdLineWidth025pt; } } }