2011年11月2日水曜日

OpenXMLを使用して、サーバーサイドでExcelファイルを生成(4)

データ読み込み編

Imports System.IO
Imports OfficeOpenXml

Protected Sub Button1_Click (ByVal sender As Object, _
                                   ByVal e As System.EventArgs) Handles Button1.Click

       Dim strFileName As String = "existingFile.xlsx"
       Dim strFilePath As String = Server.MapPath(strFileName)
       Dim existingFile As FileInfo = New FileInfo(strFilePath)

       Using xlPackage As New ExcelPackage(existingFile)
           Dim worksheet As ExcelWorksheet = xlPackage.Workbook.Worksheets(1)
           Dim intCol As Integer = 1

           For intRow As Integer = 1 To 5
               Label1.Text &= worksheet.Cells(intRow, intCol).Value & "<br />"
           Next intRow
       End Using

End Sub

サンプルは単純にラベルへ書き込んでいますが、DataGridView等へデータを流すことも可能かと思います。
それから、計算式そのものを参照したいときは、「Formula」を使用します。「Value」では計算結果の値が返されます。

OpenXMLを使用して、サーバーサイドでExcelファイルを生成(3)

テンプレート使用編

Imports System.IO
Imports OfficeOpenXml

Protected Sub Button1_Click(ByVal sender As Object, _
                                    ByVal e As System.EventArgs) Handles Button1.Click
        'テンプレートファイルの場所
        Dim strFileTemplate As String = Server.MapPath("templateFile.xlsx")
        Dim strFileName As String = "newFile.xlsx"
        Dim strFilePath As String = Server.MapPath(strFileName)
        Dim templateFile As New FileInfo(strFileTemplate)
        Dim newFile As New FileInfo(strFilePath)

        Dim strData() As String = _
               {"鉛筆", "消しゴム", "ボールペン", "サインペン", "修正ペン"}

        If newFile.Exists Then
            newFile.Delete()
            'ファイルが存在する場合は削除します。
            newFile = New FileInfo(strFilePath)
        End If

        'ExcelPackage クラスを利用してデータセットのデータをシートにマッピング
        Using xlPackage As ExcelPackage = _
            New ExcelPackage(newFile, templateFile)

            Dim worksheet As ExcelWorksheet = _
                                        xlPackage.Workbook.Worksheets("Sheet1")

            Dim ColumnIndex As Integer = 0
            Dim rowIndex As Integer = 0

            For i = 1 To strData.Length
                worksheet.Cells(i + 1, 1).Value = strData(i - 1)
            Next i

            xlPackage.Save()
        End Using

        Response.Redirect(strFileName)

End Sub

テンプレートファイル
templateFile

プログラム実行後
templateFile2

2011年11月1日火曜日

OpenXMLを使用して、サーバーサイドでExcelファイルを生成(2)

EPPlusを使用した、Webアプリのサンプルプログラム(新規作成編)

Imports System.IO
Imports OfficeOpenXml

Protected Sub Button1_Click(ByVal sender As Object, _
                                    ByVal e As System.EventArgs)  Handles Button1.Click
        'ファイルの場所
        Dim strFileName As String = "newFile.xlsx"
        Dim strFilePath As String = Server.MapPath(strFileName)
        Dim newFile As FileInfo = New FileInfo(strFilePath)

        Dim strData() As String = _
               {"品名", "鉛筆", "消しゴム", "ボールペン", "サインペン", "修正ペン"}

        Dim i As Integer

        If newFile.Exists Then
            newFile.Delete()
            'ファイルが存在する場合は削除します。
            newFile = New FileInfo(strFilePath)
        End If

        'ExcelPackage クラスを利用してデータセットのデータをシートにマッピング
        Using xlPackage As ExcelPackage = New ExcelPackage(newFile)

            Dim worksheet As ExcelWorksheet = _
                   xlPackage.Workbook.Worksheets.Add("Sheet1")

            For i = 1 To strData.Length
                worksheet.Cells(i, 1).Value = strData(i - 1)
            Next  i

            'ヘッダーとなる項目を装飾する
            Using r As ExcelRange = worksheet.Cells(1, 1)
                '塗りつぶしの色を指定
                r.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid
                r.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.SkyBlue)

                '中央揃え
                r.Style.HorizontalAlignment = Style.ExcelHorizontalAlignment.Center
            End Using

            xlPackage.Save()

        End Using

        Response.Redirect(strFileName)

End Sub

このサンプルは単純ですが、当然ADO.NETやLINQを使用して、DBからデータを取得することも可能です。

newFile

OpenXMLを使用して、サーバーサイドでExcelファイルを生成(1)

イントラ環境において、サーバーサイドでExcelファイルを生成したいというニーズは結構あります。
DataGridViewで対応していたのですが、Excel2007で開きますと、開くことは出来るのですが、以下のメッセージが表示が出てしまいどうも気持ち悪いです。

ExcelError

また、OpenOfficeでは開くことも出来ないです。

そこで注目したは『OpenXML』です。以前、VSUGのセミナーにてMSエバンジェリスト小高氏がセッションで紹介していたのを記憶していました。
「System.IO.Packing API」や「Open XML Format SDK」を使う手法を紹介していましたが、それ以外に「ExcelPackage」というのがCodePlexにあります。
その派生版?の「EPPlus」のというライブラリもありまして、こちらの方が使い勝手が良いのでご紹介致します。

EPPlus-Create advanced Excel 2007 spreadsheets on the server

Excel2003等の過去のバージョンでも互換機能パックを入れる事により、開くことが出来ます。
http://www.microsoft.com/downloads/details.aspx?FamilyID=941b3470-3ae9-4aee-8f43-c6bb74cd1466&displayLang=ja

サンプルソースがC#なので、VB.NETのコードを順次アップしています。

2011年10月31日月曜日

InPrivate フィルターを IE 起動時にオンする方法

1.レジストリをいじる。

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Safety\PrivacIE]
"StartMode"=dword:00000001
(StartModeはなければ作成する)

2.IEを起動するのに使用するショートカットを別途作成し、「-private」のスイッチを追加する。
InPrivate
リンク先を以下の様にする

"C:\Program Files\Internet Explorer\iexplore.exe" -private

2011年10月27日木曜日

iTextを利用してJAVAでPDFファイルを作成する

現在のWebシステムにおいて帳票の出力を行う場合、PDF形式を用いるのがベターな選択肢と思います。
一般的なオープンソースのライブラリとして「iText」が有名で、「JAVA iText」で検索するとたくさんのサンプルソースがヒットします。
しかしながら、2011年現在ではそのサンプルソースが古くなってしまい、そのままコピーペーストしても動かないことがあります。
2011年現在で動作するサンプルコードを掲載致します。

iTextのライブラリを以下のサイトよりダウンロードして下さい。
http://itextpdf.com/
日本語を表示させるには「iTextAsian.jar」も必要です。
http://itext.svn.sourceforge.net/viewvc/itext/book/lib/itext-asian.jar?view=log

1.[WEB-INF]-[lib]にライブラリをコピーして下さい。
itext2

2.[プロジェクト]-[プロパティ]から[Javaのビルド・パス]を選択して、[ライブラリー]タブから[外部JARの追加]ボタンをクリックし、上記のライブラリを追加して下さい。
itext1

3. 以下のソースを実行してブラウザ内でPDFファイルが表示されればOKです。

package testServlet;

import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;

public class hello extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();

        try {
            // 出力先を指定し、文書をPDFとして出力
            Document doc = new Document(PageSize.A4, 50, 50, 50, 50);
            PdfWriter pdfwriter = PdfWriter.getInstance(doc, byteOut);

            Rectangle pageSize = doc.getPageSize();
            pdfwriter.setBoxSize(
                    "art",
                    new Rectangle(36, 50, pageSize.getWidth() - 50, pageSize
                            .getHeight() - 36));

            // 日本語フォントの設定
            Font font = new Font(BaseFont.createFont("HeiseiKakuGo-W5",
                    "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED),18);

            Font font_red = new Font(BaseFont.createFont("HeiseiKakuGo-W5",
                    "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED), 18);
            font_red.setColor(BaseColor.RED);

            // ヘッダー・フッター設定
            pdfwriter.setPageEvent(new PdfPageEventHelper() {
                //ヘッダーのフォント
                Font font_header = new Font(BaseFont.createFont(
                        "HeiseiKakuGo-W5", "UniJIS-UCS2-H",
                        BaseFont.NOT_EMBEDDED), 10, Font.ITALIC);

                //フッターのフォント
                Font font_page = new Font(BaseFont.createFont(
                        "HeiseiKakuGo-W5", "UniJIS-UCS2-H",
                        BaseFont.NOT_EMBEDDED), 9, Font.NORMAL);

                @Override
                public void onEndPage(PdfWriter writer, Document document) {
                    Rectangle rect = writer.getBoxSize("art");

                    //ヘッダー表示
                    Phrase header = new Phrase("ヘッダー", font_header);

                    ColumnText.showTextAligned(writer.getDirectContent(),
                            Element.ALIGN_LEFT, header, rect.getLeft(),
                            rect.getTop(), 0);

                    //フッター(ページ)表示
                    Phrase page = new Phrase(String.format("- %d -",
                            writer.getPageNumber()), font_page);

                    ColumnText.showTextAligned(writer.getDirectContent(),
                            Element.ALIGN_CENTER, page,
                            (rect.getLeft() + rect.getRight()) / 2,
                            rect.getBottom(), 0);

                }

            });

            // 出力開始
            doc.open();

            // 出力するPDFに説明を付与
            doc.addAuthor("作成者");
            doc.addSubject("iTextサンプル");

            // 文書に要素を追加
            doc.add(new Paragraph("おはよう", font));
            doc.add(new Paragraph("こんにちは", font_red));

            // 出力終了
            doc.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }

        // ブラウザへの出力
        response.setContentType("application/pdf");
        response.setContentLength(byteOut.size());
        OutputStream out = response.getOutputStream();
        out.write(byteOut.toByteArray());
        out.close();
    }
}

2011年10月25日火曜日

SQLServer2005のDataフォルダを規定値から変更したい

後から変更出来ますが、インストール時にあらかじめ設定しておいた方が気持ちが良いです。
「インストールするコンポーネント」ダイアログで「詳細設定」をクリックすることで、参照先を変更可能。
その際、変にフォルダを作らず単純に「D:\」を選択。
そうすると、「D:\MSSQL.1\MSSQL」と作成されます。