본문 바로가기
오토 매크로

데이타 핸들러 액션 만들기. (전체 소스 포함)

by ngmaster 2020. 2. 1.
반응형

안녕하세요. 소심비형입니다. 오늘 알아볼 내용은 데이타 핸들러 액션입니다. NGM은 엑셀 xls, xlsx, csv를 비롯한 데이타베이스 기능을 사용하여 메모리에 DataTable로 불러올 수 있습니다. 예를 들어 아래와 같은 데이타를 순환하면서 데이타를 확인하고 용도에 맞게 실행하고 싶을 수 있습니다. 참고로, 아래 데이타는 웹크롤링 기능을 이용하여 비트코인 거래소의 내용을 가져와서 데이타베이스에 저장한 자료입니다.

 

 

이런 데이타들은 열과 행으로 소스에 접근이 가능합니다. 예를 들어 10행에 3열이라면 9602000 데이타를 가져올 수 있죠. 이렇게 메모리에 적재된 데이타 테이블에서 열과 행으로 접근하기 위해 사용할 수 있는 액션입니다. 물론, 엑셀로 정리한 자료들도 순환 반복하면서 데이타를 가져오고 가공해서 어떤 처리를 하는 자동화된 업무 매크로를 쉽게 만들 수 있습니다. 아래는 전체 소스입니다.

  1. using System;

  2. using System.Collections.Generic;

  3. using System.ComponentModel;

  4. using System.Data;

  5. using System.Linq;

  6. using System.Text;

  7. using System.Threading.Tasks;

  8.  

  9. namespace CustomNGM

  10. {

  11. [Serializable]

  12. public class DataTableHandlerModel : NGM.Models.Interface.BaseCustomToolModel, NGM.Interface.IResetDataProperty

  13. {

  14. /// <summary>

  15. /// 도구 상자에 표시할 카테고리 이름입니다.

  16. /// </summary>

  17. public override string DisplayCategory { get { return "NGM 커스텀 도구"; } }

  18.  

  19. /// <summary>

  20. /// 도구 상자에 표시할 액션 이름입니다.

  21. /// </summary>

  22. public override string DisplayName { get { return "데이타 핸들러"; } }

  23.  

  24. [Category("Data")]

  25. [DisplayName("데이타")]

  26. [Description("사용자가 선택한 열과 행의 데이타입니다.")]

  27. [Browsable(true)]

  28. [ReadOnly(true)]

  29. public string Data { get; set; }

  30.  

  31. [Category("Data")]

  32. [DisplayName("데이타 테이블")]

  33. [Description("값을 조회하여 변수에 저장할 데이타 테이블입니다.")]

  34. [Browsable(true)]

  35. [ReadOnly(true)]

  36. public DataTable DataTable { get; set; }

  37.  

  38. [Category("Action")]

  39. [DisplayName("행 위치")]

  40. [Description("데이타를 가져올 데이타 테이블의 행 위치입니다. 위치는 0부터 시작합니다.")]

  41. [Browsable(true)]

  42. [DefaultValue(0)]

  43. public int RowIndex { get; set; }

  44.  

  45. [Category("Action")]

  46. [DisplayName("열 위치")]

  47. [Description("데이타를 가져올 데이타 테이블의 열 위치입니다. 위치는 0부터 시작합니다.")]

  48. [Browsable(true)]

  49. [DefaultValue(0)]

  50. public int ColumnIndex { get; set; }

  51.  

  52. [Category("Action")]

  53. [DisplayName("열 이름")]

  54. [Description("데이타를 가져올 데이타 테이블의 열 이름입니다. 열 위치보다 이 값이 우선 적용됩니다.")]

  55. [Browsable(true)]

  56. [DefaultValue(null)]

  57. public string ColumnName { get; set; }

  58.  

  59. public override void Execute()

  60. {

  61. if (DataTable == null)

  62. {

  63. MainView.WriteOutput("데이타 테이블이 없습니다. 먼저 변수로부터 데이타 테이블을 가져와야 합니다.");

  64. Data = null;

  65. return;

  66. }

  67.  

  68. if (DataTable.Rows.Count == 0)

  69. {

  70. MainView.WriteOutput("데이타 테이블에 데이타가 없습니다.");

  71. Data = null;

  72. return;

  73. }

  74.  

  75. try

  76. {

  77. int colIndex = this.ColumnIndex;

  78.  

  79. if (!string.IsNullOrEmpty(this.ColumnName))

  80. colIndex = this.DataTable.Columns.IndexOf(this.ColumnName);

  81.  

  82. Data = this.DataTable.Rows[this.RowIndex][colIndex].ToString();

  83. }

  84. catch (Exception ex)

  85. {

  86. MainView.WriteOutput($"Error {ex.Message}");

  87. Data = null;

  88. return;

  89. }

  90. }

  91.  

  92. public void Initialize()

  93. {

  94. this.Data = null;

  95. }

  96. }

  97. }

 

 

전체 소스는 첨부 파일로 압축되어 있습니다.

 

반응형

댓글