ExcelMailMerge

SpreadsheetControl의 MailMerge 관련 기능

Static Method

Preview

  • 엑셀 메일 머지 출력물의 미리보기 실행

  • Parameters

    • IWorkbook document : 미리보기에 표현할 Spreadsheet 문서 객체

    • string typeId : 문서의 타입 아이디

    • Dictionary<string, object> queryParams : 데이터 조회시 필요한 파라미터 정보

    • DataSet mailMergeDataSource : 메일 머지 바인딩할 데이터

    • string mailMergeDataMember : 메일 머지 바인딩할 데이터의 Data Member

    • string filterExpression : 등록된 엑셀 문서 데이터의 필터 조건 (sysExcelMailMergeMaster 테이블의 필드 참조. DataTable.Select 의 파라미터로 사용)

  • Returns

    • bool : 처리에 실패시 false 반환

public static bool Preview(IWorkbook document);

public static bool Preview(string typeId, Dictionary<string, object> queryParams, string filterExpression = "");

public static bool Preview(string typeId, DataSet mailMergeDataSource, string mailMergeDataMember, string filterExpression = "");

EditInPreview

  • 메일 머지 바인딩 된 엑셀 출력물을 사용자가 수정 할 수 있는 팝업으로 실행

  • Parameters

    • IWorkbook document : 미리보기에 표현할 Spreadsheet 문서 객체

    • string typeId : 문서의 타입 아이디

    • Dictionary<string, object> queryParams : 데이터 조회시 필요한 파라미터 정보

    • DataSet mailMergeDataSource : 메일 머지 바인딩할 데이터

    • string mailMergeDataMember : 메일 머지 바인딩할 데이터의 Data Member

    • string filterExpression : 등록된 엑셀 문서 데이터의 필터 조건 (sysExcelMailMergeMaster 테이블의 필드 참조. DataTable.Select 의 파라미터로 사용)

  • Returns

    • bool : 처리에 실패시 false 반환

public static bool EditInPreview(IWorkbook document);

public static bool EditInPreview(string typeId, Dictionary<string, object> queryParams, string filterExpression = "");

public static bool EditInPreview(string typeId, DataSet mailMergeDataSource, string mailMergeDataMember, string filterExpression = "");

Print

  • 엑셀 메일 머지 출력물을 미리보기 없이 바로 인쇄

  • Parameters

    • IWorkbook document : 인쇄할 Spreadsheet 문서 객체

    • string typeId : 문서의 타입 아이디

    • Dictionary<string, object> queryParams : 데이터 조회시 필요한 파라미터 정보

    • DataSet mailMergeDataSource : 메일 머지 바인딩할 데이터

    • string mailMergeDataMember : 메일 머지 바인딩할 데이터의 Data Member

    • string filterExpression : 등록된 엑셀 문서 데이터의 필터 조건 (sysExcelMailMergeMaster 테이블의 필드 참조. DataTable.Select 의 파라미터로 사용)

  • Returns

    • bool : 처리에 실패시 false 반환

public static bool Print(IWorkbook document);

public static bool Print(string typeId, Dictionary<string, object> queryParams, string filterExpression = "");

public static bool Print(string typeId, DataSet mailMergeDataSource, string mailMergeDataMember, string filterExpression = "");

GenerateMailMergeDocument

  • 엑셀 메일 머지 출력물의 문서(IWorkbook)를 반환

  • Parameters

    • string typeId : 문서의 타입 아이디

    • Dictionary<string, object> queryParams : 데이터 조회시 필요한 파라미터 정보

    • DataSet mailMergeDataSource : 메일 머지 바인딩할 데이터

    • string mailMergeDataMember : 메일 머지 바인딩할 데이터의 Data Member

    • string filterExpression : 등록된 엑셀 문서 데이터의 필터 조건 (sysExcelMailMergeMaster 테이블의 필드 참조. DataTable.Select 의 파라미터로 사용)

    • out string documentId : 메일 머지 데이터가 바인딩된 문서의 문서ID (sysExcelMailMergeMaster 테이블의 document_id 필드 값)

  • Returns

    • IWorkbook : 등록된 엑셀 문서 정보를 참조하여 데이터 조회 후 메일 머지 바인딩 처리된 문서

public static IWorkbook GenerateMailMergeDocument(string typeId, Dictionary<string, object> queryParams, string filterExpression = "");

public static IWorkbook GenerateMailMergeDocument(string typeId, DataSet mailMergeDataSource, string mailMergeDataMember, string filterExpression = "");

public static IWorkbook GenerateMailMergeDocument(string typeId, Dictionary<string, object> queryParams, string filterExpression, out string documentId);

public static IWorkbook GenerateMailMergeDocument(string typeId, DataSet mailMergeDataSource, string mailMergeDataMember, string filterExpression, out string documentId);

ExecuteQuery

  • 등록된 엑셀 문서 정보를 참조하여 데이터 조회

  • out 키워드를 사용하여 결과를 받아옴 (DataSource, DataMember)

  • Parameters

    • string typeId : 문서의 타입 아이디

    • Dictionary<string, object> queryParams : 데이터 조회시 필요한 파라미터 정보

    • out DataSet result : 쿼리 실행 결과 DataSource

    • out string resultDataMember : 쿼리 실행 결과 DataMember

  • Returns

    • bool : 조회에 실패시 false

public static bool ExecuteQuery(string typeId, Dictionary<string, object> queryParams, out DataSet result, out string resultDataMember);

RetrieveDocumentInfo

  • 실행중인 폼의 메뉴ID로 등록된 모든 엑셀 문서 리스트를 반환

  • Parameters

    • string filterExpression : 등록된 엑셀 문서 데이터의 필터 조건 (sysExcelMailMergeMaster 테이블의 필드 참조. DataTable.Select 의 파라미터로 사용)

  • Returns

    • DataTable : 쿼리 실행 결과

public static DataTable RetrieveDocumentInfo(string filterExpression = "");

ShowPrintDialog

  • 실행중인 폼에 문서 타입 아이디로 등록된 문서 전체 리스트를 조회하는 팝업을 열고, 선택하여 인쇄

  • Parameters

    • string typeId : 문서의 타입 아이디

    • Dictionary<string, object> queryParams : 데이터 조회시 필요한 파라미터 정보

  • Returns

    • DialogResult : 정상적으로 출력 신호를 보내면 DialogResult.OK 반환

public static DialogResult ShowPrintDialog(string typeId, Dictionary<string, object> queryParams);

Example

case 1

  • 일반적인 방법 (문서에 대한 별도의 처리를 하지 않음)

try
{
    var paramDatas = new Dictionary<string, object>();
    paramDatas.Add("@p_itemcd", "0304203B0070000500C");

    ExcelMailMerge.Preview("TEST_01", paramDatas, $"orgdiv = '{SessionInfo.orgdiv}'");
}
catch (Exception ex)
{
    ShowErrorMessageBox(ex);
}

case 2

  • 등록된 엑셀 문서 정보를 참조하여 데이터 조회 후 메일 머지 바인딩 처리된 문서(IWorkbook)를 반환 받아 가공하여 인쇄

  • ex) Spreadsheet 그리기 옵션 및 셀 병합 등

try
{
    var paramDatas = new Dictionary<string, object>();
    paramDatas.Add("@p_itemcd", "0304203B0070000500C");
    
    var document = ExcelMailMerge.GenerateMailMergeDocument("DWG_01", paramDatas);

    //
    //// 여기에 엑셀 문서 수정
    //Worksheet mainSheet = document.Worksheets[0];
    //
    
    ExcelMailMerge.Preview(document);
}
catch (Exception ex)
{
    ShowErrorMessageBox(ex);
}

case 3

  • 등록된 엑셀 문서 정보를 참조하여 데이터 조회 결과를 반환 받아 DataColumn, DataRow를 추가하는 등의 작업을 거친 후 메일 머지 바인딩 후 인쇄

  • ex) QR코드 이미지 추가 등

try
{
    var paramDatas = new Dictionary<string, object>();
    paramDatas.Add("@p_itemcd", "0304203B0070000500C");

    if (!ExcelMailMerge.ExecuteQuery("TEST_01", paramDatas, out DataSet result, out string dataMember))
        return;

    if ((result?.Tables?.Count ?? 0) > 0)
    {
        result.Tables[0].Columns.Add("qrcode", typeof(Image));
        foreach (DataRow row in result.Tables[0].Rows)
        {
            row["qrcode"] = GetQrImage(row["itemcd"].ToString());
        }
    }

    ExcelMailMerge.Preview("TEST_01", result, dataMember);
}
catch (Exception ex)
{
    ShowErrorMessageBox(ex);
}

case 4

  • 첨부파일로 등록된 이미지나 PDF 파일을 확인하여, 조회된 엑셀 출력물에 다음 페이지로 등록

public override void ClickPreviewButton()
{
    ExcelMailMerge.Preview(CreatePrintout());
}

public override void ClickPrintButton()
{
    ExcelMailMerge.Print(CreatePrintout());
}

private IWorkbook CreatePrintout()
{
    if (gvwList.FocusedRowHandle < 0)
    {
        ShowMessageBox(Messages.NoDataSelected);
        return null;
    }

    Dictionary<string, object> queryParams = new Dictionary<string, object>();
    queryParams.Add("@p_orgdiv", SessionInfo.orgdiv);
    queryParams.Add("@p_datnum", txtDatnum1.Text);
    queryParams.Add("@p_login_user", SessionInfo.UserId);

    try
    {
        WaitFormEx.Show();

        IWorkbook mainWorkbook = ExcelMailMerge.GenerateMailMergeDocument("QC_A4000", queryParams);
        mainWorkbook.Unit = DevExpress.Office.DocumentUnit.Millimeter;

        // 첨부파일 정보 조회
        string query = $@"
            SELECT savenm, realnm
            FROM sysAttachments
            WHERE attdatnum = ISNULL(
		                    (	SELECT attdatnum	
			                    FROM QC040T  
			                    WHERE orgdiv = '{SessionInfo.orgdiv}' AND datnum = '{txtDatnum1.Text}'), '') ";

        DataTable attachDatas = ExecuteSql(query, false)?[0];

        // 이미지 파일 처리
        var images = new List<Image>();

        if ((attachDatas?.Rows?.Count ?? 0) > 0)
        {
            foreach (DataRow row in attachDatas.Rows)
            {
                string savenm = row.GetValue("savenm")?.ToString() ?? string.Empty;
                string realnm = row.GetValue("realnm")?.ToString() ?? string.Empty;

                bool isImageFile = Util.IsRecognisedImageFile(realnm);
                byte[] fileBytes = null;
                Image image = null;

                // 이미지 or PDF 파일만 등록
                if (isImageFile || Path.GetExtension(realnm).Equals(".pdf", StringComparison.OrdinalIgnoreCase))
                {
                    if (isImageFile)
                    {
                        fileBytes = FileDownload(Path.Combine(AttachmentHelper.BaseUploadDirectory, savenm));
                        using (MemoryStream ms = new MemoryStream(fileBytes))
                        {
                            image = Image.FromStream(ms);
                        }
                    }
                    else
                    {
                        var fileBytesOfPdf = FileDownload(Path.Combine(AttachmentHelper.BaseUploadDirectory, savenm));
                        using (MemoryStream stream = new MemoryStream(fileBytesOfPdf))
                        {
                            PdfDocumentProcessor processor = new PdfDocumentProcessor();
                            processor.LoadDocument(stream);
                            image = processor.CreateBitmap(1, 1000);

                            fileBytes = image.ConvertImageToByteArray();

                            processor.CloseDocument();
                        }
                    }

                    images.Add(image);
                }
            }
        }

        foreach (Image image in images)
        {
            if (image == null)
                continue;

            Worksheet newWorksheet = mainWorkbook.Worksheets.Add();
            newWorksheet.ActiveView.Margins.Top = 12F;
            newWorksheet.ActiveView.Margins.Bottom = 12F;
            newWorksheet.ActiveView.Margins.Left = 6F;
            newWorksheet.ActiveView.Margins.Right = 6F;

            Range range;

            // 용지 가로 설정
            if (image.Width > image.Height)
            {
                range = newWorksheet["A1:O36"];
                newWorksheet.ActiveView.Orientation = PageOrientation.Landscape;
            }
            // 용지 세로 설정
            else
            {
                range = newWorksheet["A1:L48"];
                newWorksheet.ActiveView.Orientation = PageOrientation.Portrait;
            }

            newWorksheet.SetPrintRange(range);

            // 이미지 추가
            Picture picture = newWorksheet.Pictures.AddPicture(image, range, true);

            // 이미지 가운데로 이동
            float offsetX = (float)((range.ColumnWidth * range.ColumnCount) - picture.Width) / 2F;
            float offsetY = (float)((range.RowHeight * range.RowCount) - picture.Height) / 2F;
            picture.Move(offsetY, offsetX);
        }

        WaitFormEx.Close();

        return mainWorkbook;
    }
    catch (Exception ex)
    {
        ShowErrorMessageBox(ex);
        WaitFormEx.Close();
        return null;
    }
}

Example - 미리보기 없이 엑셀 출력물 파일(.xlsx)을 사용자가 지정한 경로에 저장

private void SaveExcelDocument()
{
    Dictionary<string, object> paramValues = new Dictionary<string, object>();

    paramValues.Add("@p_orgdiv", SessionInfo.orgdiv);
    // ...
    // ...

    IWorkbook spreadsheet = ExcelMailMerge.GenerateMailMergeDocument("type", paramValues);

    SaveFileDialog sfd = new SaveFileDialog();
    sfd.Filter = "Excel Files (*.xlsx)|*.xlsx";
    sfd.FileName = $"{this.Text}.xlsx";

    if (sfd.ShowDialog() == DialogResult.OK)
    {
        spreadsheet.SaveDocument(sfd.FileName, DocumentFormat.Xlsx);
    }
}

※ IWorkbook 자료형은 DevExpress.Spreadsheet 네임스페이스에 정의된 인터페이스임 (어셈블리: DevExpress.Spreadsheet.v18.1.Core.dll )

Last updated

Was this helpful?