C\#에서 워드 내 보 내기 기능 에 대한 자세 한 설명

19805 단어 c#word도 출
머리말
새해 복 많이 받 으 세 요.
년 전 마지막 으로 한 편 을 쓰기 전에 프로젝트 개발 의 기능 을 자신 이 시스템 업무 에 따라 생각 한 해결 방법,효율 이 좋 습 니 다.쓸데없는 말 하지 않 고 정리!!
필요:
기업 은 자신의 기업 정 보 를 시스템 에 기입 하고 마지막 으로 데 이 터 를 주어진 워드 템 플 릿 형식 으로 내 보 내야 한다.기능 이 간단 하고 개발 이 빠 르 고 서둘러 야 한다.
분석:주로 시간 이 걸 리 는 작업 은 디자인 업 체 가 양식 디자인 을 작성 하여 실현 하고 제 공 된 워드 템 플 릿 에 따라 데 이 터 를 내 보 내 는 것 입 니 다.관련 된 양식 이 비교적 많 기 때문에 한 양식 이 적어도 150 여 개의 필드 가 있 고 한 쌍 이 맞 으 며 머리 도 한 줌 씩 빠 져 야 합 니 다.
생각 나 는 해결 법안:워드 라 는 기능 모듈 을 내 보 내 고 통용 되 는 방법 을 써 서 작업량 을 줄 입 니 다.
워드 데이터 내 보 내기 기능 은 워드 템 플 릿 에 데 이 터 를 입력 해 야 하 는 곳 마다 탭 을 명명 하 는 것 입 니 다.코드 에서 이름 에 맞 는 탭 을 찾 아 값 을 삽입 하 는 것 입 니 다.
전통 적 인 방법,첫 번 째 단계:워드 템 플 릿 에 탭 두 번 째 단 계 를 작성 합 니 다.프로그램 에 있 는 모든 삽입 필드 데이터 와 워드 템 플 릿 라벨 이 대응 하고 마지막 에 삽입 합 니 다.이렇게 하면 시간 이 오래 걸 리 고 오류 가 발생 하기 쉬 운 문제 가 있 습 니 다.
내 방법,첫 번 째 단계:데이터 필드 에 사용자 정의 기능 을 주 고 사용자 정의 기능 에 해당 하 는 탭 주 소 를 쓰 고 반사 적 인 방법 으로 데 이 터 를 워드 템 플 릿 에 삽입 합 니 다.이렇게 하면 워드 에 라벨 을 쓰 는 첫 번 째 번 째 번 거 로 운 작업 을 줄 일 수 있 습 니 다.이렇게 하 는 문 제 는 성능 이 비교적 떨 어 지 는 것 이지 만 무시 해도 된다.
대체적으로 생각 이 이 렇 습 니 다.저 는 단독으로 demo 를 써 서 여러분 께 참고 하도록 하 겠 습 니 다.그 후에 사용 할 수 있 으 면 바로 사용 하고 생각 과 생각 에 대한 공유 와 토론 에 중심 을 두 겠 습 니 다.
쓰기 시작:
새 항목:ExportWordModel


최종 프로젝트 간이 구조:

쓸모없는 것 을 모두 제거 하고 Index.cshtml 페이지 를 이렇게 수정 합 니 다.

@{
 ViewBag.Title = "Home Page";
}
<div class="jumbotron" style="text-align: center">
 @*<h1>ASP.NET</h1>*@
 <input type="button" value="  " onclick="location.href = '@Url.Action("GetExport","Home")'" />
</div>
홈 컨트롤 러 에서 만 들 기:GetExport
클래스 ExportFileOperator(모든 워드 작업)를 만 들 려 면 Controller 를 계승 해 야 합 니 다.File 작업 방법 이 있 기 때 문 입 니 다.

1.GetExport 에서 먼저 내 보 내기 워드 제목 을 명명 합 니 다.테스트 내 보 내기 Word 파일

string title = "    Word  ";
doc 만 들 기:

 var doc = ExportFileOperator.CreateBuilder("GroupForm.doc");
2.CreateBuilder 방법 은 다음 과 같 습 니 다.(여기 서 조작 하려 면 Aspose.Word 구성 요소 가 필요 합 니 다.워드 를 조작 하 는 것 입 니 다.이것 은 여러분 이 직접 찾 아 보 거나 인터넷 에서 해결 할 것 을 찾 아야 합 니 다)

private static string _tempPath = AppDomain.CurrentDomain.BaseDirectory;
public static (Document doc, DocumentBuilder builder) CreateBuilder(string tempFileName)
{
 string tempPath = $"{_tempPath}{tempFileName}";
 Document doc = new Document(tempPath);
 return (doc, new DocumentBuilder(doc));
}
3.제목 삽입(워드 에 탭 을 써 야 합 니 다.제목 으로 삽 입 된 주소):

최종 결 과 는 다음 과 같 습 니 다.

방법:

ExportFileOperator.InsertTitle(ref doc.Item2, title);//    


public static void InsertTitle(ref DocumentBuilder builder, string fileName, string tempBookMarkName = "title")
{
  builder.MoveToBookmark(tempBookMarkName);
  builder.Write(fileName);
}
4.업무 실체 에 따라 실체 데 이 터 를 word 에 기록 하 는 것 도 핵심 이다.
우선 데이터 클래스 이름:

public class EnterpriseEntity
 {
   #region     
  /// <summary>
  /// id
  /// </summary>
  public string id { get; set; }
  /// <summary>
  ///    
  /// </summary>
  [Description("    ")]
  public string v1 { get; set; }
  /// <summary>
  ///         
  /// </summary>
  [Description("        ")]
  public string v3 { get; set; }
  /// <summary>
  ///     
  /// </summary>
  [Description("    ")]
  public string v4 { get; set; }

  /// <summary>
  ///       
  /// </summary>
  [Description("      ")]
  public string v5 { get; set; }
  /// <summary>
  ///     
  /// </summary>
  [Description("    ")]
  public string v6 { get; set; }
  /// <summary>
  ///              
  /// </summary>
  [Description("           ")]
  public string v7 { get; set; }
  /// <summary>
  ///                 
  /// </summary>
  [Description("              ")]
  public string v9 { get; set; }
  /// <summary>
  ///                   
  /// </summary>
  [Description("                ")]
  public string v11 { get; set; }
  /// <summary>
  ///                
  /// </summary>
  [Description("      ")]
  public string v13 { get; set; }
  /// <summary>
  ///                
  /// </summary>
  [Description("             ")]
  public string v20 { get; set; }
  /// <summary>
  ///       
  /// </summary>
  [Description("      ")]
  public string v22 { get; set; }
  /// <summary>
  ///     
  /// </summary>
  [Description("    ")]
  public string v24 { get; set; }
  /// <summary>
  ///     (     )
  /// </summary>
  [Description("    ")]
  public string v25 { get; set; }
  /// <summary>
  ///       
  /// </summary>
   [Description("      ")]
  public string v26 { get; set; }
  /// <summary>
  ///     
  /// </summary>
  [Description("       ")]
  public string v27 { get; set; }
  /// <summary>
  ///     
  /// </summary>
   [Description("    ")]
  public string v28 { get; set; }
  /// <summary>
  ///     
  /// </summary>
   [Description("       ")]
  public string v29 { get; set; }
  /// <summary>
  ///     
  /// </summary>
  [Description("    ")]
  public string v30 { get; set; }
  /// <summary>
  ///       
  /// </summary>
  [Description("      ")]
  public string v31 { get; set; }
  /// <summary>
  ///     
  /// </summary>
   [Description("    ")]
  public string v32 { get; set; }
  /// <summary>
  ///      
  /// </summary>
  [Description("   ")]
  public string v33 { get; set; }
  /// <summary>
  ///      
  /// </summary>
  [Description("   ")]
  public string v34 { get; set; }
  /// <summary>
  ///      
  /// </summary>
  [Description("   ")]
  public string v35 { get; set; }
  /// <summary>
  ///        
  /// </summary>
  [Description("     ")]
  public string v36 { get; set; }
  /// <summary>
  ///       
  /// </summary>
  [Description("    ")]
  public string v37 { get; set; }
  /// <summary>
  ///       
  /// </summary>
  [Description("    ")]
  public string v38 { get; set; }
  /// <summary>
  ///       
  /// </summary>
  [Description("    ")]
  public string v39 { get; set; }
  /// <summary>
  ///       
  /// </summary>
  [Description("    ")]
  public string v40 { get; set; }
  /// <summary>
  ///           
  /// </summary>
  [Description("        ")]
  public string v41 { get; set; }
  /// <summary>
  ///        
  /// </summary>
  [Description("     ")]
  public string v42 { get; set; }
  /// <summary>
  ///         
  /// </summary>
  [Description("      ")]
  public string v43 { get; set; }
  /// <summary>
  ///     
  /// </summary>
  [Description("    ")]
  public string v44 { get; set; }
  /// <summary>
  ///               
  /// </summary>
  [Description("            ")]
  public string v45 { get; set; }
  /// <summary>
  ///     (  1000 )
  /// </summary>
  [Description("    ")]
  public string v46 { get; set; }
  /// <summary>
  ///      
  /// </summary>
  [Description("     ")]
  public string v47 { get; set; }
  /// <summary>
  ///      
  /// </summary>
  [Description("     ")]
  public string v48 { get; set; }
  /// <summary>
  ///         
  /// </summary>
  public string v49 { get; set; }
  /// <summary>
  ///                  
  /// </summary>
  [Description("                 ")]
  public string v50 { get; set; }
  /// <summary>
  ///       (1000   )
  /// </summary>
  [Description("      (1000   )")]
  public string v51 { get; set; }
  /// <summary>
  ///       
  /// </summary>
  [Description("      ")]
  public string v52 { get; set; }
  /// <summary>
  ///        
  /// </summary>
  [Description("       ")]
  public string v53 { get; set; }
  /// <summary>
  ///         
  /// </summary>
  [Description("        ")]
  public string v54 { get; set; }
  /// <summary>
  ///            
  /// </summary>
  [Description("           ")]
  public string v56 { get; set; }
  /// <summary>
  ///        
  /// </summary>
  [Description("       ")]
  public string v57 { get; set; }
  /// <summary>
  ///       
  /// </summary>
  [Description("      ")]
  public string v58 { get; set; }
  /// <summary>
  ///                       
  /// </summary>
  [Description("                    ")]
  public string v59 { get; set; }
  /// <summary>
  ///             ?  
  /// </summary>
  [Description("            ")]
  public string v60 { get; set; }
  /// <summary>
  ///       、     (1000   )
  /// </summary>
  [Description("      、     (1000   )")]
  public string v61 { get; set; }
  /// <summary>
  ///     
  /// </summary>
  [Description("    ")]
  public string v62 { get; set; }
  /// <summary>
  ///     
  /// </summary>
  [Description("    ")]
  public string v63 { get; set; }
  /// <summary>
  ///                 
  /// </summary>
  [Description("              ")]
  public string v64 { get; set; }
  /// <summary>
  ///       
  /// </summary>
  [Description("          ")]
  public string v65 { get; set; }
  /// <summary>
  ///          
  /// </summary>
  [Description("           ")]
  public string v66 { get; set; }
  /// <summary>
  ///     (  ¥)
  /// </summary>
  [Description("              ")]
  public string v67 { get; set; }
  /// <summary>
  ///        
  /// </summary>
  [Description("      ")]
  public string v68 { get; set; }
  /// <summary>
  ///     
  /// </summary>
  [Description("           ")]
  public string v69 { get; set; }
  /// <summary>
  ///       
  /// </summary>
  [Description("          ")]
  public string v70 { get; set; }
  /// <summary>
  ///              (             )
  /// </summary>
  [Description("          ")]
  public string v71 { get; set; }
  /// <summary>
  ///               (             )
  /// </summary>
  [Description("          ")]
  public string v72 { get; set; }
  /// <summary>
  ///                        (              )
  /// </summary>
  [Description("           ")]
  public string v73 { get; set; }
  #endregion

  public List<string> GetThisDescriptionName()
  {
   var result = new List<string>();
   GetType().GetProperties().ToList().ForEach(f =>
   {
    var descriptionObj = (DescriptionAttribute[])f.GetCustomAttributes(typeof(DescriptionAttribute), false);
    if (descriptionObj.Length > 0 && !string.IsNullOrWhiteSpace(descriptionObj[0].Description))
    {
     result.Add(descriptionObj[0].Description);
    }
   });
   return result;
  }
 }
그 중에서 중요 한 것 은 필드 마다 설명 을 해 야 합 니 다.이 안의 값 은 워드 템 플 릿 의 이름 입 니 다.다음 과 같 습 니 다.

여 기 는 데이터 가 비밀 이기 때문에 일부 필드 를 삭 제 했 습 니 다.워드 템 플 릿 의 일부 도 삭 제 했 고 일부분 만 꺼 냈 습 니 다.
데이터베이스 와 상호작용 하 는 부분 을 나 도 쓰 지 않 고 찾 아 낸 데 이 터 를 먼저 라 고 명명 했다.enerpriseStr,마지막 으로 Newtonsoft 를 실체 로 바 꾸 어 이렇게 작 동 했 습 니 다.

 EnterpriseEntity enterprise = JsonConvert.DeserializeObject<EnterpriseEntity>(_enterpriseStr);

5.찾 아 낸 데 이 터 를 워드 에 삽입 하여 최종 내 보 내기 완료:

ExportFileOperator.InsertFormData(enterprise, ref doc.Item1);//      
return new ExportFileOperator().FileResult(title, doc.Item1);
그 중에서 가장 중요 한 방법 은 바로 InsertFormData 이다.그의 실현 은 다음 과 같다.

public static void InsertFormData<T>(T objFormData, ref Document document)
{
   NodeCollection allTables = document.GetChildNodes(NodeType.Table, true);
   List<string> headDescribeNameList = GetObjectHeadDescription<T>();//       Description   
   foreach (Table tableFirst in allTables)
   {
    for (int headIndex = 0; headIndex < headDescribeNameList.Count; headIndex++)//        DescribeName
    {
     for (int rowIndex = 0; rowIndex < tableFirst.Rows.Count; rowIndex++)//  word      table
     {
      for (int cellIndex = 0; cellIndex < tableFirst.Rows[rowIndex].Cells.Count; cellIndex++)//        table     
      {
       if (tableFirst.Rows[rowIndex].Cells[cellIndex].GetText() != null && tableFirst.Rows[rowIndex].Cells[cellIndex].GetText().Contains(headDescribeNameList[headIndex]) &&
         ((tableFirst.Rows[rowIndex].Cells.Count > cellIndex && tableFirst.Rows[rowIndex].Cells[cellIndex + 1] != null && tableFirst.Rows[rowIndex].Cells[cellIndex + 1].GetText().Equals("\a")) || (tableFirst.Rows.Count > rowIndex && tableFirst.Rows[rowIndex + 1] != null && tableFirst.Rows[rowIndex + 1].Cells[cellIndex] != null && tableFirst.Rows[rowIndex + 1].Cells[cellIndex].GetText().Equals("\a"))))//     cell   、      DescribeName   ,          cell    cell   ,    ,       
       {
        var objValue = GetObjectValueByPropName(objFormData, headDescribeNameList[headIndex]);//  DescribeName      
        if (tableFirst.Rows[rowIndex].Cells.Count > cellIndex && tableFirst.Rows[rowIndex].Cells[cellIndex + 1] != null && tableFirst.Rows[rowIndex].Cells[cellIndex + 1].GetText().Equals("\a"))
        {
         InsertCell(objValue, document, tableFirst.Rows[rowIndex].Cells[cellIndex + 1]);//          
         break;
        }
        InsertCell(objValue, document, tableFirst.Rows[rowIndex + 1].Cells[cellIndex]);//               
        break;
       }
      }
     }
    }
   }
 }

 public static List<string> GetObjectHeadDescription<T>()
{
 var obj = Activator.CreateInstance<T>();
 MethodInfo method = obj.GetType().GetMethod("GetThisDescriptionName", new Type[] { });//       GetThisDescriptionName    
 return (List<string>)(method?.Invoke(obj, null));
 }
그 중에서 GetThis DescriptionName 방법 은 모든 실체 클래스 에서 이 루어 져 야 합 니 다.

descriptionName 에 따라 실체의 값 가 져 오기:

private static string GetObjectValueByPropName<T>(T objFormData, string descriptionName)
{
   try
   {
    var properties = objFormData.GetType().GetProperties();
    foreach (var propertyInfo in properties)
    {
     var descriptionAttributes = (DescriptionAttribute[])propertyInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
     if (descriptionAttributes.Length > 0 && !string.IsNullOrWhiteSpace(descriptionAttributes[0].Description) && descriptionAttributes[0].Description.Equals(descriptionName))
     {
      return propertyInfo.GetValue(objFormData) == null ? " " : propertyInfo.GetValue(objFormData).ToString();
     }
    }
    return " ";
   }
   catch (Exception e)
   {
    Console.WriteLine(e);
    throw;
   }
}
cell 에 값 삽입:

private static void InsertCell(string value, Document doc, Cell cell)
 {
   Cell insertCell = cell;
   insertCell.FirstParagraph.Remove();
   Paragraph p = new Paragraph(doc);
   p.AppendChild(new Run(doc, (value == null ? "" : value)));
   p.ParagraphFormat.Alignment = ParagraphAlignment.Center;
   insertCell.CellFormat.VerticalAlignment = CellVerticalAlignment.Center;
   insertCell.AppendChild(p);
 }
마지막 방법 FileResult:

public FileResult FileResult(string fileName, Document doc)
{
   var filePathName = $"{fileName}.doc";
   doc.Save(Path.Combine(_tempPath, "temp", filePathName), SaveFormat.Doc); //  word
   filePathName = Path.Combine(_tempPath, "temp", filePathName);
   return File(filePathName, "application/doc", $"{fileName}.Doc");
}
최종 효과:


마지막 으로 말씀 드 리 지만 그 중에서 세부 적 인 부분 은 처리 해 야 합 니 다.잠시 쓸 시간 이 없고 후기 에 보충 할 시간 이 있 습 니 다.먼저 이렇게 하 겠 습 니 다.
여러분 은 어떤 좋 은 생각 이나 더 좋 은 실현 방식 이 있 으 면 얼마든지 제기 하고 함께 진보 하 세 요.
git 주소:https://github.com/Binzm/ExportWorkdModel.git
총결산
C\#에서 워드 내 보 내기 기능 소 동작 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C\#워드 내 보 내기 기능 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기