Skip to content

Commit ec8b7d3

Browse files
Added required attributes to empty cellXfs style elements in the style builders
Mirrors #962 on the maintenance branch to fix OleDb unable to connect to documents generated through MiniExcel
1 parent c1ebb20 commit ec8b7d3

2 files changed

Lines changed: 109 additions & 53 deletions

File tree

src/MiniExcel/OpenXml/Styles/DefaultSheetStyleBuilder.cs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -650,11 +650,16 @@ protected override void GenerateCellXf()
650650
_ => "bottom"
651651
};
652652

653-
/*
654-
* <x:xf />
655-
*/
653+
/* Empty style is required because Excel always considers the first one to be the default and ignores all its properties
654+
* <x:xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" />
655+
* */
656656
_context.NewXmlWriter.WriteStartElement(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI);
657-
_context.NewXmlWriter.WriteFullEndElement();
657+
_context.NewXmlWriter.WriteAttributeString("numFmtId", null, "0");
658+
_context.NewXmlWriter.WriteAttributeString("fontId", null, "0");
659+
_context.NewXmlWriter.WriteAttributeString("fillId", null, "0");
660+
_context.NewXmlWriter.WriteAttributeString("borderId", null, "0");
661+
_context.NewXmlWriter.WriteAttributeString("xfId", null, "0");
662+
_context.NewXmlWriter.WriteEndElement();
658663

659664
/*
660665
* <x:xf numFmtId="0" fontId="1" fillId="2" borderId="1" xfId="0" applyNumberFormat="1" applyFill="0" applyBorder="1" applyAlignment="1" applyProtection="1">
@@ -892,11 +897,16 @@ protected override async Task GenerateCellXfAsync()
892897
_ => "bottom"
893898
};
894899

895-
/*
896-
* <x:x />
897-
*/
898-
await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI);
899-
await _context.NewXmlWriter.WriteEndElementAsync();
900+
/* Empty style is required because Excel always considers the first one to be the default and ignores all its properties
901+
* <x:xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" />
902+
* */
903+
await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI).ConfigureAwait(false);
904+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "numFmtId", null, "0").ConfigureAwait(false);
905+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "fontId", null, "0").ConfigureAwait(false);
906+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "fillId", null, "0").ConfigureAwait(false);
907+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "borderId", null, "0").ConfigureAwait(false);
908+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "xfId", null, "0").ConfigureAwait(false);
909+
await _context.NewXmlWriter.WriteEndElementAsync().ConfigureAwait(false);
900910

901911
/*
902912
* <x:xf numFmtId="0" fontId="1" fillId="2" borderId="1" xfId="0" applyNumberFormat="1" applyFill="0" applyBorder="1" applyAlignment="1" applyProtection="1">

src/MiniExcel/OpenXml/Styles/MinimalSheetStyleBuilder.cs

Lines changed: 90 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -131,38 +131,61 @@ protected override async Task GenerateCellStyleXfAsync()
131131
protected override void GenerateCellXf()
132132
{
133133
/*
134-
* <x:xf />
135-
* <x:xf />
136-
* <x:xf />
137-
* <x:xf numFmtId="14" applyNumberFormat="1" />
138-
* <x:xf />
139-
* <x:xf numFmtId="21" applyNumberFormat="1" />
140-
*/
141-
_context.NewXmlWriter.WriteStartElement(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI);
142-
_context.NewXmlWriter.WriteFullEndElement();
143-
_context.NewXmlWriter.WriteStartElement(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI);
144-
_context.NewXmlWriter.WriteFullEndElement();
145-
_context.NewXmlWriter.WriteStartElement(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI);
146-
_context.NewXmlWriter.WriteFullEndElement();
134+
* <x:xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" />
135+
* <x:xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" />
136+
* <x:xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" />
137+
* <x:xf numFmtId="14" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1" />
138+
* <x:xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" />
139+
* <x:xf numFmtId="21" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1" />
140+
* */
141+
142+
for (int i = 0; i < 3; i++)
143+
{
144+
_context.NewXmlWriter.WriteStartElement(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI);
145+
_context.NewXmlWriter.WriteAttributeString("numFmtId", null, "0");
146+
_context.NewXmlWriter.WriteAttributeString("fontId", null, "0");
147+
_context.NewXmlWriter.WriteAttributeString("fillId", null, "0");
148+
_context.NewXmlWriter.WriteAttributeString("borderId", null, "0");
149+
_context.NewXmlWriter.WriteAttributeString("xfId", null, "0");
150+
_context.NewXmlWriter.WriteEndElement();
151+
}
152+
147153
_context.NewXmlWriter.WriteStartElement(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI);
148-
_context.NewXmlWriter.WriteAttributeString("numFmtId", "14");
149-
_context.NewXmlWriter.WriteAttributeString("applyNumberFormat", "1");
150-
_context.NewXmlWriter.WriteFullEndElement();
154+
_context.NewXmlWriter.WriteAttributeString("numFmtId", null, "14");
155+
_context.NewXmlWriter.WriteAttributeString("fontId", null, "0");
156+
_context.NewXmlWriter.WriteAttributeString("fillId", null, "0");
157+
_context.NewXmlWriter.WriteAttributeString("borderId", null, "0");
158+
_context.NewXmlWriter.WriteAttributeString("xfId", null, "0");
159+
_context.NewXmlWriter.WriteAttributeString("applyNumberFormat", null, "1");
160+
_context.NewXmlWriter.WriteEndElement();
151161
_context.NewXmlWriter.WriteStartElement(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI);
152-
_context.NewXmlWriter.WriteFullEndElement();
162+
_context.NewXmlWriter.WriteAttributeString("numFmtId", null, "0");
163+
_context.NewXmlWriter.WriteAttributeString("fontId", null, "0");
164+
_context.NewXmlWriter.WriteAttributeString("fillId", null, "0");
165+
_context.NewXmlWriter.WriteAttributeString("borderId", null, "0");
166+
_context.NewXmlWriter.WriteAttributeString("xfId", null, "0");
167+
_context.NewXmlWriter.WriteEndElement();
153168
_context.NewXmlWriter.WriteStartElement(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI);
154-
_context.NewXmlWriter.WriteAttributeString("numFmtId", "21");
155-
_context.NewXmlWriter.WriteAttributeString("applyNumberFormat", "1");
156-
_context.NewXmlWriter.WriteFullEndElement();
169+
_context.NewXmlWriter.WriteAttributeString("numFmtId", null, "21");
170+
_context.NewXmlWriter.WriteAttributeString("fontId", null, "0");
171+
_context.NewXmlWriter.WriteAttributeString("fillId", null, "0");
172+
_context.NewXmlWriter.WriteAttributeString("borderId", null, "0");
173+
_context.NewXmlWriter.WriteAttributeString("xfId", null, "0");
174+
_context.NewXmlWriter.WriteAttributeString("applyNumberFormat", null, "1");
175+
_context.NewXmlWriter.WriteEndElement();
157176

158177
const int numFmtIndex = 166;
159178
for (var i = 1; i <= _context.CustomFormatCount; i++)
160179
{
161180
/*
162-
* <x:xf numFmtId="{numFmtIndex + i}" applyNumberFormat="1"
181+
* <x:xf numFmtId="{numFmtIndex + i}" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1" applyNumberFormat="1"
163182
*/
164183
_context.NewXmlWriter.WriteStartElement(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI);
165184
_context.NewXmlWriter.WriteAttributeString("numFmtId", (numFmtIndex + i).ToString());
185+
_context.NewXmlWriter.WriteAttributeString("fontId", null, "0");
186+
_context.NewXmlWriter.WriteAttributeString("fillId", null, "0");
187+
_context.NewXmlWriter.WriteAttributeString("borderId", null, "0");
188+
_context.NewXmlWriter.WriteAttributeString("xfId", null, "0");
166189
_context.NewXmlWriter.WriteAttributeString("applyNumberFormat", "1");
167190
_context.NewXmlWriter.WriteEndElement();
168191
}
@@ -171,29 +194,48 @@ protected override void GenerateCellXf()
171194
protected override async Task GenerateCellXfAsync()
172195
{
173196
/*
174-
* <x:xf />
175-
* <x:xf />
176-
* <x:xf />
177-
* <x:xf numFmtId="14" applyNumberFormat="1" />
178-
* <x:xf />
179-
* <x:xf numFmtId="21" applyNumberFormat="1" />
180-
*/
181-
await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI);
182-
await _context.NewXmlWriter.WriteFullEndElementAsync();
183-
await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI);
184-
await _context.NewXmlWriter.WriteFullEndElementAsync();
185-
await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI);
186-
await _context.NewXmlWriter.WriteFullEndElementAsync();
187-
await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI);
188-
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "numFmtId", null, "14");
189-
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "applyNumberFormat", null, "1");
190-
await _context.NewXmlWriter.WriteFullEndElementAsync();
191-
await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI);
192-
await _context.NewXmlWriter.WriteEndElementAsync();
193-
await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI);
194-
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "numFmtId", null, "21");
195-
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "applyNumberFormat", null, "1");
196-
await _context.NewXmlWriter.WriteFullEndElementAsync();
197+
* <x:xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" />
198+
* <x:xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" />
199+
* <x:xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" />
200+
* <x:xf numFmtId="14" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1" />
201+
* <x:xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" />
202+
* <x:xf numFmtId="21" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1" />
203+
* */
204+
205+
for (int i = 0; i < 3; i++)
206+
{
207+
await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI).ConfigureAwait(false);
208+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "numFmtId", null, "0").ConfigureAwait(false);
209+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "fontId", null, "0").ConfigureAwait(false);
210+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "fillId", null, "0").ConfigureAwait(false);
211+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "borderId", null, "0").ConfigureAwait(false);
212+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "xfId", null, "0").ConfigureAwait(false);
213+
await _context.NewXmlWriter.WriteEndElementAsync().ConfigureAwait(false);
214+
}
215+
216+
await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI).ConfigureAwait(false);
217+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "numFmtId", null, "14").ConfigureAwait(false);
218+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "fontId", null, "0").ConfigureAwait(false);
219+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "fillId", null, "0").ConfigureAwait(false);
220+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "borderId", null, "0").ConfigureAwait(false);
221+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "xfId", null, "0").ConfigureAwait(false);
222+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "applyNumberFormat", null, "1").ConfigureAwait(false);
223+
await _context.NewXmlWriter.WriteEndElementAsync().ConfigureAwait(false);
224+
await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI).ConfigureAwait(false);
225+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "numFmtId", null, "0").ConfigureAwait(false);
226+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "fontId", null, "0").ConfigureAwait(false);
227+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "fillId", null, "0").ConfigureAwait(false);
228+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "borderId", null, "0").ConfigureAwait(false);
229+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "xfId", null, "0").ConfigureAwait(false);
230+
await _context.NewXmlWriter.WriteEndElementAsync().ConfigureAwait(false);
231+
await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI).ConfigureAwait(false);
232+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "numFmtId", null, "21").ConfigureAwait(false);
233+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "fontId", null, "0").ConfigureAwait(false);
234+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "fillId", null, "0").ConfigureAwait(false);
235+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "borderId", null, "0").ConfigureAwait(false);
236+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "xfId", null, "0").ConfigureAwait(false);
237+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "applyNumberFormat", null, "1").ConfigureAwait(false);
238+
await _context.NewXmlWriter.WriteEndElementAsync().ConfigureAwait(false);
197239

198240
const int numFmtIndex = 166;
199241
for (var i = 1; i <= _context.CustomFormatCount; i++)
@@ -203,6 +245,10 @@ protected override async Task GenerateCellXfAsync()
203245
*/
204246
await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "xf", _context.OldXmlReader.NamespaceURI);
205247
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "numFmtId", null, (numFmtIndex + i).ToString());
248+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "fontId", null, "0").ConfigureAwait(false);
249+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "fillId", null, "0").ConfigureAwait(false);
250+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "borderId", null, "0").ConfigureAwait(false);
251+
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "xfId", null, "0").ConfigureAwait(false);
206252
await _context.NewXmlWriter.WriteAttributeStringAsync(null, "applyNumberFormat", null, "1");
207253
await _context.NewXmlWriter.WriteFullEndElementAsync();
208254
}

0 commit comments

Comments
 (0)