C\#에서 워드 내 보 내기 기능 에 대한 자세 한 설명
새해 복 많이 받 으 세 요.
년 전 마지막 으로 한 편 을 쓰기 전에 프로젝트 개발 의 기능 을 자신 이 시스템 업무 에 따라 생각 한 해결 방법,효율 이 좋 습 니 다.쓸데없는 말 하지 않 고 정리!!
필요:
기업 은 자신의 기업 정 보 를 시스템 에 기입 하고 마지막 으로 데 이 터 를 주어진 워드 템 플 릿 형식 으로 내 보 내야 한다.기능 이 간단 하고 개발 이 빠 르 고 서둘러 야 한다.
분석:주로 시간 이 걸 리 는 작업 은 디자인 업 체 가 양식 디자인 을 작성 하여 실현 하고 제 공 된 워드 템 플 릿 에 따라 데 이 터 를 내 보 내 는 것 입 니 다.관련 된 양식 이 비교적 많 기 때문에 한 양식 이 적어도 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\#워드 내 보 내기 기능 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.