2013-08-06 1 views
0

현재 Ms - Word Labeling 기능을 사용하는 .net 데스크톱 응용 프로그램에서 작업하고 있습니다. 한 번에 약 5000 개의 레코드를 인쇄해야합니다. 내 코드에 따르면 약 3.5 분이 걸립니다. 여기, 내 코드에서 약간의 더미 데이터를 전달하지만 실제 시나리오에서는 큰 데이터를 전달해야합니다.Ms-Word 레이블링을 통한 C# .net 최적화 문제

내 코드는 다음과 같습니다

 oWord = new Word.Application(); 
     oWord.Visible = false; 

     object missing = System.Reflection.Missing.Value; 
     object isVisible = false; 
     object filename = @"C:\Users\jc\Desktop\label1.docx"; 
     object saveFile; 

     oDoc = oWord.Documents.Open(ref filename, ConfirmConversions: false, ReadOnly: true); 

     var innerTable = oDoc.Content.Tables[1]; 

     int totalLabelsPerPage = innerTable.Rows.Count * innerTable.Columns.Count; 
     int totalRowsPerPage = innerTable.Rows.Count; 
     int totalColumnsPerPage = innerTable.Columns.Count; 

     String[] collection = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63" }; 

     object StartPoint = 0; 

     Range MyRange; 
     int requiredTables = 1; 

     while ((requiredTables * totalRowsPerPage * totalColumnsPerPage) < collection.Length) 
     { 
      MyRange = oDoc.Range(ref StartPoint, ref missing); 
      MyRange.Collapse(Microsoft.Office.Interop.Word.WdCollapseDirection.wdCollapseEnd‌); 
      MyRange.InsertBreak(Microsoft.Office.Interop.Word.WdBreakType.wdSectionBreakNextPage); 
      MyRange.InsertFile(@"C:\Users\jc\Desktop\label.docx"); 
      requiredTables++; 
     } 

     int count = oDoc.Content.Tables.Count; 

     int no = 1; 
     int columnCount = innerTable.Columns.Count; 
     int currentColumn = 1; 
     int cont = 0; 
     int columns = 1; 
     int currentTableNo = 1; 

     while (cont <= collection.Length) 
     { 
      innerTable = oDoc.Content.Tables[currentTableNo]; 
      innerTable.Range.Bold = 1; 
      innerTable.Range.Bold = 1; 
      innerTable.Range.Text = "sdadad"; 
      innerTable.Range.Font.Bold = 1; 
      innerTable.Range.Font.Color = Word.WdColor.wdColorBlue; 
      innerTable.Range.Font.Size = 15F; 
      innerTable.Range.Font.Name = "Verdana"; 
      while (columns <= columnCount) 
      { 
       innerTable.Columns[columns].Cells[no].Range.Text = collection[cont]; 
       no++; 
       cont++; 
       if (cont == collection.Length) 
        break; 
       else if (no == totalRowsPerPage+1) 
       { 
        columns++; 
        no=1; 
       } 
      } 
      if (cont == collection.Length) 
       break; 
      else 
      { 
       columns = 1; 
       currentTableNo++; 
      } 
     } 
     this.Cursor = Cursors.Default; 
     oWord.Visible = true; 
     oDoc.Activate(); 

어떤 도움을 크게 appriciated 수 있습니다 .. !!

감사합니다.

+0

유일한 문제는 효율성 (시간 소요)입니까? –

+0

@ 카즈 쟈 : 예. 유일한 문제는 시간입니다 ... –

답변

1

코드의 주된 문제는 Interop를 사용한다는 것입니다. Interop은 본질적으로 지옥처럼 느립니다. 속도를 높이기는하지만 연령대는 여전히 오래 걸릴 것입니다. Word를 사용하지 않고 파일을 만들 수 있습니다. 도서관이나 Office에서 xml을 직접 열면 단어를 열지 않고 .docx 파일을 만들 수 있습니다. 단점은 위에서 언급 한 간단한 코드보다 많은 개발 리소스를 필요로한다는 것입니다. 그래서 개발 가치가 있는지 결정해야합니다. 아마도 도움이 될 것입니다 : http://docx.codeplex.com/ 도서관을 모르지만 Office Open XML을 직접 다루는 라이브러리가 더 좋습니다.

+0

제안 해 주셔서 감사합니다. 구현하려고하지만 실제로 설치 패키지 크기를 늘리고 싶지는 않습니다. 그래서 나는 처음에 제 3 자 dll을 선호하지 않았다. –

+0

내가 본 Office Open XMl 패키지의 대부분은 매우 가볍습니다. 나는 .docx 라이브러리의 경우가 될 것이라고 생각합니다. 파일 크기가 왜 문제가됩니까? –

+0

우리는 우리의 응용 프로그램에 너무 많은 기능을 제공하고 있습니다. 그래서 이미 부피가 커지며 이제는 인터넷을 통해 고객에게 설정을 제공하고 있습니다. 그래서 우리 고객이 5 분 안에 설정을 얻을 수 있기를 바랍니다. –