66using MiniExcelLibs . WriteAdapter ;
77using MiniExcelLibs . Zip ;
88using System ;
9- using System . Collections ;
109using System . Collections . Generic ;
1110using System . IO ;
1211using System . IO . Compression ;
1312using System . Linq ;
1413using System . Text ;
14+ using System . Xml . Linq ;
1515
1616namespace MiniExcelLibs . OpenXml
1717{
@@ -101,32 +101,33 @@ public void Insert(bool overwriteSheet = false)
101101 {
102102 currentSheetIndex = existSheetDto . SheetIdx ;
103103 _archive . Entries . Single ( s => s . FullName == existSheetDto . Path ) . Delete ( ) ;
104- _archive . Entries . SingleOrDefault ( s => s . FullName == ExcelFileNames . DrawingRels ( currentSheetIndex ) ) ? . Delete ( ) ;
105- _archive . Entries . SingleOrDefault ( s => s . FullName == ExcelFileNames . Drawing ( currentSheetIndex ) ) ? . Delete ( ) ;
106104 CreateSheetXml ( _value , existSheetDto . Path ) ;
107105 }
108106
109107 AddFilesToZip ( ) ;
110108
111- GenerateDrawinRelXml ( currentSheetIndex ) ;
109+ _archive . Entries . SingleOrDefault ( s => s . FullName == ExcelFileNames . DrawingRels ( currentSheetIndex - 1 ) ) ? . Delete ( ) ;
110+ GenerateDrawinRelXml ( currentSheetIndex - 1 ) ;
112111
113- GenerateDrawingXml ( currentSheetIndex ) ;
112+ _archive . Entries . SingleOrDefault ( s => s . FullName == ExcelFileNames . Drawing ( currentSheetIndex - 1 ) ) ? . Delete ( ) ;
113+ GenerateDrawingXml ( currentSheetIndex - 1 ) ;
114114
115115 GenerateWorkBookXmls ( out StringBuilder workbookXml , out StringBuilder workbookRelsXml , out Dictionary < int , string > sheetsRelsXml ) ;
116-
117116 foreach ( var sheetRelsXml in sheetsRelsXml )
118117 {
119118 var sheetRelsXmlPath = ExcelFileNames . SheetRels ( sheetRelsXml . Key ) ;
120119 _archive . Entries . SingleOrDefault ( s => s . FullName == sheetRelsXmlPath ) ? . Delete ( ) ;
121120 CreateZipEntry ( sheetRelsXmlPath , null , ExcelXml . DefaultSheetRelXml . Replace ( "{{format}}" , sheetRelsXml . Value ) ) ;
122121 }
123122
124- _archive . Entries . SingleOrDefault ( s => s . FullName == ExcelFileNames . Workbook ) ? . Delete ( ) ;
123+ _archive . Entries . SingleOrDefault ( s => s . FullName == ExcelFileNames . Workbook ) . Delete ( ) ;
125124 CreateZipEntry ( ExcelFileNames . Workbook , ExcelContentTypes . Workbook , ExcelXml . DefaultWorkbookXml . Replace ( "{{sheets}}" , workbookXml . ToString ( ) ) ) ;
126125
127- _archive . Entries . SingleOrDefault ( s => s . FullName == ExcelFileNames . WorkbookRels ) ? . Delete ( ) ;
126+ _archive . Entries . SingleOrDefault ( s => s . FullName == ExcelFileNames . WorkbookRels ) . Delete ( ) ;
128127 CreateZipEntry ( ExcelFileNames . WorkbookRels , null , ExcelXml . DefaultWorkbookXmlRels . Replace ( "{{sheets}}" , workbookRelsXml . ToString ( ) ) ) ;
129128
129+ InsertContentTypesXml ( ) ;
130+
130131 _archive . Dispose ( ) ;
131132 }
132133
@@ -384,9 +385,6 @@ private void AddFilesToZip()
384385 }
385386 }
386387
387- /// <summary>
388- /// styles.xml
389- /// </summary>
390388 private void GenerateStylesXml( )
391389 {
392390 using ( var context = new SheetStyleBuildContext ( _zipDictionary , _archive , _utf8WithBom , _configuration . DynamicColumns ) )
@@ -440,9 +438,6 @@ private void GenerateDrawingXml(int sheetIndex)
440438 ExcelXml . DefaultDrawing . Replace ( "{{format}}" , drawing ) ) ;
441439 }
442440
443- /// <summary>
444- /// workbook.xml、workbookRelsXml
445- /// </summary>
446441 private void GenerateWorkbookXml ( )
447442 {
448443 GenerateWorkBookXmls (
@@ -469,16 +464,45 @@ private void GenerateWorkbookXml()
469464 ExcelXml . DefaultWorkbookXmlRels . Replace ( "{{sheets}}" , workbookRelsXml . ToString ( ) ) ) ;
470465 }
471466
472- /// <summary>
473- /// [Content_Types].xml
474- /// </summary>
475467 private void GenerateContentTypesXml ( )
476468 {
477469 var contentTypes = GetContentTypesXml ( ) ;
478470
479471 CreateZipEntry ( ExcelFileNames . ContentTypes , null , contentTypes ) ;
480472 }
481473
474+ private void InsertContentTypesXml ( )
475+ {
476+ var contentTypesZipEntry = _archive . Entries . SingleOrDefault ( s => s . FullName == ExcelFileNames . ContentTypes ) ;
477+ if ( contentTypesZipEntry == null )
478+ {
479+ GenerateContentTypesXml ( ) ;
480+ return ;
481+ }
482+ using ( var stream = contentTypesZipEntry . Open ( ) )
483+ {
484+ var doc = XDocument . Load ( stream ) ;
485+ var ns = doc . Root . GetDefaultNamespace ( ) ;
486+ var typesElement = doc . Descendants ( ns + "Types" ) . Single ( ) ;
487+ var partNames = new HashSet < string > ( StringComparer . InvariantCultureIgnoreCase ) ;
488+ foreach ( var partName in typesElement . Elements ( ns + "Override" ) . Select ( s => s . Attribute ( "PartName" ) . Value ) )
489+ {
490+ partNames . Add ( partName ) ;
491+ }
492+ foreach ( var p in _zipDictionary )
493+ {
494+ var partName = $ "/{ p . Key } ";
495+ if ( ! partNames . Contains ( partName ) )
496+ {
497+ var newElement = new XElement ( ns + "Override" , new XAttribute ( "ContentType" , p . Value . ContentType ) , new XAttribute ( "PartName" , partName ) ) ;
498+ typesElement . Add ( newElement ) ;
499+ }
500+ }
501+ stream . Position = 0 ;
502+ doc . Save ( stream ) ;
503+ }
504+ }
505+
482506 private void CreateZipEntry ( string path , string contentType , string content )
483507 {
484508 ZipArchiveEntry entry = _archive . CreateEntry ( path , CompressionLevel . Fastest ) ;
0 commit comments