WriterTests.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. using ExcelORM;
  2. using ExcelORM.Models;
  3. namespace ExcelORMTests;
  4. public class WriterTests
  5. {
  6. private static readonly Test[] ArrayOfThree =
  7. [
  8. new() { Name = "Bilbo", Surname = "Baggins", Job = "Eater"},
  9. new() { Name = "John", Job = "Policeman"},
  10. new() { Name = "Bruce", Surname = "Lee", Job = "Fighter"}
  11. ];
  12. private static readonly List<Test> ListOfTwo =
  13. [
  14. new() { Name = "Elon", Surname = "Musk", Job = "Comedian" },
  15. new() { Name = "Donald", Surname = "Trump", Job = "Bankrupt" }
  16. ];
  17. [Fact]
  18. public void WriteWithAppend()
  19. {
  20. var testFile = Path.GetRandomFileName();
  21. testFile = Path.ChangeExtension(testFile, "xlsx");
  22. const string worksheetName = "Test";
  23. using var writer = new ExcelWriter(testFile);
  24. writer.Write(ArrayOfThree, worksheetName);
  25. writer.SaveAs(testFile);
  26. using var reader = new ExcelReader(testFile);
  27. var readArray = reader.Read<Test>(worksheetName).ToArray();
  28. Assert.Equal(3, readArray.Length);
  29. for (int i = 0; i < readArray.Length; i++)
  30. Assert.Equal(ArrayOfThree[i], readArray[i]);
  31. writer.Write(ListOfTwo, worksheetName, true);
  32. writer.SaveAs(testFile);
  33. using var newReader = new ExcelReader(testFile);
  34. Assert.Equal(5, newReader.Read<Test>(worksheetName).Count());
  35. File.Delete(testFile);
  36. }
  37. [Fact]
  38. public void WriteWithAppendWithoutName()
  39. {
  40. var testFile = Path.GetRandomFileName();
  41. testFile = Path.ChangeExtension(testFile, "xlsx");
  42. using var writer = new ExcelWriter(testFile);
  43. writer.Write(ArrayOfThree);
  44. writer.SaveAs(testFile);
  45. using var reader = new ExcelReader(testFile);
  46. Assert.Equal(ArrayOfThree.Length, reader.Read<Test>().Count());
  47. writer.Write(ListOfTwo, append: true);
  48. writer.SaveAs(testFile);
  49. using var newReader = new ExcelReader(testFile);
  50. Assert.Equal(5, newReader.Read<Test>().Count());
  51. File.Delete(testFile);
  52. }
  53. private const string ForAppend = "testFiles/forAppend.xlsx";
  54. [Fact]
  55. public void WriteWithAppendExisting()
  56. {
  57. var testFile = Path.GetRandomFileName();
  58. testFile = Path.ChangeExtension(testFile, "xlsx");
  59. File.Copy(ForAppend, testFile);
  60. uint headerRowIndex = 3;
  61. using var writer = new ExcelWriter(testFile);
  62. writer.Write(ArrayOfThree, append: true, headerRowIndex: headerRowIndex);
  63. writer.SaveAs(testFile);
  64. using var reader = new ExcelReader(testFile);
  65. var readArray = reader.Read<Test>(startFrom: headerRowIndex).ToArray();
  66. Assert.Equal(6, readArray.Length);
  67. for (int i = 0; i < ArrayOfThree.Length; i++)
  68. Assert.Equal(ArrayOfThree[i], readArray[i+3]);
  69. File.Delete(testFile);
  70. }
  71. private const string ForAppendWithRubbish = "testFiles/forAppendWithRubbish.xlsx";
  72. [Fact]
  73. public void WriteWithAppendExistingAndRubbish()
  74. {
  75. var testFile = Path.GetRandomFileName();
  76. testFile = Path.ChangeExtension(testFile, "xlsx");
  77. File.Copy(ForAppendWithRubbish, testFile);
  78. uint headerRowIndex = 3;
  79. using var writer = new ExcelWriter(testFile);
  80. writer.Write(ArrayOfThree, append: true, headerRowIndex: headerRowIndex, startFrom: 7);
  81. writer.SaveAs(testFile);
  82. using var reader = new ExcelReader(testFile);
  83. var readArray = reader.Read<Test>(startFrom: headerRowIndex).ToArray();
  84. Assert.Equal(6, readArray.Length);
  85. for (int i = 0; i < ArrayOfThree.Length; i++)
  86. Assert.Equal(ArrayOfThree[i], readArray[i+3]);
  87. File.Delete(testFile);
  88. }
  89. private const string ForAppendHeaderFirst = "testFiles/forAppendHeaderFirst.xlsx";
  90. [Fact]
  91. public void WriteWithAppendExistingHeaderFirst()
  92. {
  93. var testFile = Path.GetRandomFileName();
  94. testFile = Path.ChangeExtension(testFile, "xlsx");
  95. File.Copy(ForAppendHeaderFirst, testFile);
  96. using var writer = new ExcelWriter(testFile);
  97. writer.Write(ArrayOfThree, append: true);
  98. writer.SaveAs(testFile);
  99. using var reader = new ExcelReader(testFile);
  100. var readArray = reader.Read<Test>().ToArray();
  101. Assert.Equal(6, readArray.Length);
  102. for (int i = 0; i < ArrayOfThree.Length; i++)
  103. Assert.Equal(ArrayOfThree[i], readArray[i + 3]);
  104. File.Delete(testFile);
  105. }
  106. private const string EmptyFileForAppend = "testFiles/emptyForAppend.xlsx";
  107. [Fact]
  108. public void WriteWithAppendEmpty()
  109. {
  110. var testFile = Path.GetRandomFileName();
  111. testFile = Path.ChangeExtension(testFile, "xlsx");
  112. File.Copy(EmptyFileForAppend, testFile);
  113. using var writer = new ExcelWriter(testFile);
  114. writer.Write(ArrayOfThree, append: true);
  115. writer.SaveAs(testFile);
  116. using var reader = new ExcelReader(testFile);
  117. var readArray = reader.Read<Test>().ToArray();
  118. Assert.Equal(3, readArray.Length);
  119. for (int i = 0; i < ArrayOfThree.Length; i++)
  120. Assert.Equal(ArrayOfThree[i], readArray[i]);
  121. File.Delete(testFile);
  122. }
  123. [Fact]
  124. public void WriteDifferentTypes()
  125. {
  126. var testFile = Path.GetRandomFileName();
  127. testFile = Path.ChangeExtension(testFile, "xlsx");
  128. var expected = new TestTypes
  129. {
  130. Date = DateTime.Now,
  131. TimeSpan = TimeSpan.FromSeconds(360),
  132. Double = 2.33,
  133. Int = 1024,
  134. Text = "Test"
  135. };
  136. var list = new List<TestTypes>{ expected };
  137. using var writer = new ExcelWriter(testFile);
  138. writer.Write(list);
  139. writer.SaveAs(testFile);
  140. using var reader = new ExcelReader(testFile);
  141. var result = reader.Read<TestTypes>().ToList();
  142. Assert.Single(result);
  143. var first = result.First();
  144. Assert.Equal(expected.Date.ToString(), first.Date.ToString());
  145. Assert.NotNull(first.TimeSpan);
  146. Assert.Equal(expected.TimeSpan.Value.Minutes, first.TimeSpan.Value.Minutes);
  147. Assert.Equal(expected.Double, first.Double);
  148. Assert.Equal(expected.Int, first.Int);
  149. Assert.Equal(expected.Text, first.Text);
  150. File.Delete(testFile);
  151. }
  152. private static readonly TestSkip[] ArrayWithSkip =
  153. [
  154. new() {Text = "Lorem", Date = DateTime.Now.AddHours(1), Int = 1},
  155. new() {Text = "Ipsum", Date = null, Int = 2}
  156. ];
  157. [Fact]
  158. public void WriteWithSkip()
  159. {
  160. var testFile = Path.GetRandomFileName();
  161. testFile = Path.ChangeExtension(testFile, "xlsx");
  162. const string worksheetName = "Test";
  163. using var writer = new ExcelWriter(testFile);
  164. writer.Write(ArrayWithSkip, worksheetName);
  165. writer.SaveAs(testFile);
  166. using var reader = new ExcelReader(testFile);
  167. var readArray = reader.Read<TestSkip>(worksheetName).ToArray();
  168. Assert.Equal(ArrayWithSkip.Length, readArray.Length);
  169. for (int i = 0; i < readArray.Length; i++)
  170. {
  171. Assert.NotEqual(ArrayWithSkip[i].Text, readArray[i].Text);
  172. Assert.Equal(ArrayWithSkip[i].Date.ToString(), readArray[i].Date.ToString());
  173. Assert.Equal(ArrayWithSkip[i].Int, readArray[i].Int);
  174. }
  175. File.Delete(testFile);
  176. }
  177. private static readonly TestSkipMiddle[] ArrayWithSkipMiddle =
  178. [
  179. new() {Text = "Lorem", Date = DateTime.Now.AddHours(1), Int = 1},
  180. new() {Text = "Ipsum", Date = DateTime.Now.AddHours(2), Int = 2}
  181. ];
  182. [Fact]
  183. public void WriteWithSkipMiddle()
  184. {
  185. var testFile = Path.GetRandomFileName();
  186. testFile = Path.ChangeExtension(testFile, "xlsx");
  187. const string worksheetName = "Test";
  188. using var writer = new ExcelWriter(testFile);
  189. writer.Write(ArrayWithSkipMiddle, worksheetName);
  190. writer.SaveAs(testFile);
  191. using var reader = new ExcelReader(testFile);
  192. var readArray = reader.Read<TestSkipMiddle>(worksheetName).ToArray();
  193. Assert.Equal(ArrayWithSkipMiddle.Length, readArray.Length);
  194. for (int i = 0; i < readArray.Length; i++)
  195. {
  196. Assert.Equal(ArrayWithSkipMiddle[i].Text, readArray[i].Text);
  197. Assert.NotEqual(ArrayWithSkipMiddle[i].Date.ToString(), readArray[i].Date.ToString());
  198. Assert.Equal(ArrayWithSkipMiddle[i].Int, readArray[i].Int);
  199. }
  200. File.Delete(testFile);
  201. }
  202. private static readonly TestWithFormula[] ArrayWithFormulas =
  203. [
  204. new() { Name = "Bilbo", Surname = "Baggins", Job = "Eater", FullName = new Formula{ FormulaA1 = "B2&C2" } },
  205. new() { Name = "John", Job = "Policeman", FullName = new Formula{ FormulaA1 = "B3&C3" } },
  206. new() { Name = "Bruce", Surname = "Lee", Job = "Fighter", FullName = new Formula{ FormulaA1 = "B4&C4" } }
  207. ];
  208. [Fact]
  209. public void WriteWithFormula()
  210. {
  211. var testFile = Path.GetRandomFileName();
  212. testFile = Path.ChangeExtension(testFile, "xlsx");
  213. using var writer = new ExcelWriter(testFile);
  214. writer.Write(ArrayWithFormulas);
  215. writer.SaveAs(testFile);
  216. using var reader = new ExcelReader(testFile);
  217. var readArray = reader.Read<TestWithFormula>().ToArray();
  218. Assert.Equal(ArrayWithFormulas.Length, readArray.Length);
  219. foreach (var item in readArray)
  220. {
  221. Assert.NotNull(item.FullName);
  222. Assert.Equal($"{item.Name}{item.Surname}", item.FullName.Value);
  223. }
  224. File.Delete(testFile);
  225. }
  226. private static readonly TestNumbersWithFormula[] ArrayNumbersWithFormulas =
  227. [
  228. new(){ First = 1, Second = 2, Sum = new Formula{FormulaA1 = "SUM(A2:B2)"} },
  229. new(){ First = 2, Second = 3, Sum = new Formula{FormulaA1 = "SUM(A3:B3)"} }
  230. ];
  231. [Fact]
  232. public void NumbersWithFormula()
  233. {
  234. var testFile = Path.GetRandomFileName();
  235. testFile = Path.ChangeExtension(testFile, "xlsx");
  236. using var writer = new ExcelWriter(testFile);
  237. writer.Write(ArrayNumbersWithFormulas);
  238. writer.SaveAs(testFile);
  239. using var reader = new ExcelReader(testFile);
  240. var readArray = reader.Read<TestNumbersWithFormula>().ToArray();
  241. Assert.Equal(ArrayNumbersWithFormulas.Length, readArray.Length);
  242. foreach (var item in readArray)
  243. {
  244. Assert.NotNull(item.Sum);
  245. Assert.Equal(item.First + item.Second, item.Sum.Value);
  246. }
  247. File.Delete(testFile);
  248. }
  249. private static readonly TestWithHyperlink[] ArrayWithHyperlinks =
  250. [
  251. new() { Name = "Bilbo", Surname = "Baggins", Job = "Eater", Link = new Hyperlink{ Value = "Wiki", Link = new XLHyperlink("https://en.wikipedia.org/wiki/Bilbo_Baggins") } },
  252. new() { Name = "John", Job = "Policeman", Link = new Hyperlink{ Value = "CNN", Link = new XLHyperlink("https://edition.cnn.com/2023/12/10/us/john-okeefe-boston-police-death-cec/index.html") } },
  253. new() { Name = "Bruce", Surname = "Lee", Job = "Fighter", Link = new Hyperlink{ Value = "IMDb", Link = new XLHyperlink("https://www.imdb.com/name/nm0000045/") } }
  254. ];
  255. [Fact]
  256. public void WriteWithHyperlink()
  257. {
  258. var testFile = Path.GetRandomFileName();
  259. testFile = Path.ChangeExtension(testFile, "xlsx");
  260. using var writer = new ExcelWriter(testFile);
  261. writer.Write(ArrayWithHyperlinks);
  262. writer.SaveAs(testFile);
  263. using var reader = new ExcelReader(testFile);
  264. var readArray = reader.Read<TestWithHyperlink>().ToArray();
  265. Assert.Equal(ArrayWithFormulas.Length, readArray.Length);
  266. for (var i = 0; i < readArray.Length; i++)
  267. {
  268. Assert.NotNull(ArrayWithHyperlinks[i].Link);
  269. Assert.NotNull(readArray[i].Link);
  270. Assert.Equal(ArrayWithHyperlinks[i].Link?.Value, readArray[i].Link?.Value);
  271. Assert.Equal(ArrayWithHyperlinks[i].Link?.Link?.ToString(), readArray[i].Link?.Link?.ToString());
  272. }
  273. File.Delete(testFile);
  274. }
  275. [Fact]
  276. public void WriteReadInMemory()
  277. {
  278. using var workbook = new XLWorkbook();
  279. const string worksheetName = "Test";
  280. using var writer = new ExcelWriter(workbook);
  281. writer.Write(ArrayOfThree, worksheetName);
  282. using var reader = new ExcelReader(workbook);
  283. var readArray = reader.Read<Test>(worksheetName).ToArray();
  284. Assert.Equal(3, readArray.Length);
  285. for (int i = 0; i < readArray.Length; i++)
  286. Assert.Equal(ArrayOfThree[i], readArray[i]);
  287. }
  288. [Fact]
  289. public void WriteWithStartFrom()
  290. {
  291. var testFile = Path.GetRandomFileName();
  292. testFile = Path.ChangeExtension(testFile, "xlsx");
  293. const string worksheetName = "Test";
  294. using var writer = new ExcelWriter(testFile);
  295. writer.Write(ArrayOfThree, worksheetName);
  296. writer.Write(ListOfTwo, worksheetName, startFrom: (uint)(ArrayOfThree.Length + 3));
  297. writer.SaveAs(testFile);
  298. using var reader = new ExcelReader(testFile);
  299. var readArray = reader.Read<Test>(worksheetName).ToArray();
  300. Assert.Equal(6, readArray.Length);
  301. File.Delete(testFile);
  302. }
  303. [Fact]
  304. public void FallbackToPropertyName()
  305. {
  306. using var workbook = new XLWorkbook();
  307. var worksheet = workbook.AddWorksheet("Test");
  308. var firstRow = worksheet.FirstRow();
  309. var secondRow = worksheet.Row(2);
  310. var columnIndex = 1;
  311. foreach (var property in typeof(Test).GetProperties())
  312. {
  313. firstRow.Cell(columnIndex).Value = property.Name;
  314. secondRow.Cell(columnIndex).Value = $"{columnIndex}";
  315. columnIndex++;
  316. }
  317. var test = new Test{ Name = $"{columnIndex++}", Surname = $"{columnIndex++}", Job = $"{columnIndex}" };
  318. var writer = new ExcelWriter(workbook);
  319. writer.FallbackToPropertyName = true;
  320. writer.Write([test], append: true);
  321. var reader = new ExcelReader(workbook);
  322. reader.FallbackToPropertyName = true;
  323. var results = reader.Read<Test>().ToArray();
  324. Assert.Equal(2, results.Length);
  325. Assert.Equal(test, results[1]);
  326. }
  327. }