2021-04-01 13:27:39 +08:00
|
|
|
|
using Xunit;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.IO;
|
2021-04-01 17:16:05 +08:00
|
|
|
|
using System.Collections.Generic;
|
2021-04-06 17:01:20 +08:00
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using Xunit.Abstractions;
|
2021-04-09 18:30:57 +08:00
|
|
|
|
using static MiniExcelLibs.Tests.MiniExcelOpenXmlTests;
|
|
|
|
|
using System.Globalization;
|
|
|
|
|
using OfficeOpenXml;
|
|
|
|
|
using Newtonsoft.Json;
|
2021-04-01 13:27:39 +08:00
|
|
|
|
|
|
|
|
|
namespace MiniExcelLibs.Tests
|
|
|
|
|
{
|
|
|
|
|
public partial class MiniExcelIssueTests
|
|
|
|
|
{
|
2021-04-06 17:01:20 +08:00
|
|
|
|
private readonly ITestOutputHelper output;
|
|
|
|
|
public MiniExcelIssueTests(ITestOutputHelper output)
|
|
|
|
|
{
|
|
|
|
|
this.output = output;
|
|
|
|
|
}
|
2021-04-09 18:30:57 +08:00
|
|
|
|
|
2021-04-09 19:04:41 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// https://github.com/shps951023/MiniExcel/issues/150
|
|
|
|
|
/// </summary>
|
|
|
|
|
[Fact]
|
|
|
|
|
public void Issue150()
|
|
|
|
|
{
|
|
|
|
|
var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid().ToString()}.xlsx");
|
|
|
|
|
//MiniExcel.SaveAs(path, new[] { "1", "2" });
|
|
|
|
|
Assert.Throws<NotImplementedException>(() => MiniExcel.SaveAs(path, new[] { 1, 2 }));
|
|
|
|
|
File.Delete(path);
|
|
|
|
|
Assert.Throws<NotImplementedException>(() => MiniExcel.SaveAs(path, new[] { "1", "2" }));
|
|
|
|
|
File.Delete(path);
|
|
|
|
|
Assert.Throws<NotImplementedException>(() => MiniExcel.SaveAs(path, new[] { '1', '2' }));
|
|
|
|
|
File.Delete(path);
|
|
|
|
|
Assert.Throws<NotImplementedException>(() => MiniExcel.SaveAs(path, new[] { DateTime.Now }));
|
|
|
|
|
File.Delete(path);
|
|
|
|
|
Assert.Throws<NotImplementedException>(() => MiniExcel.SaveAs(path, new[] { Guid.NewGuid() }));
|
|
|
|
|
File.Delete(path);
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-09 18:30:57 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// https://github.com/shps951023/MiniExcel/issues/157
|
|
|
|
|
/// </summary>
|
|
|
|
|
[Fact]
|
|
|
|
|
public void Issue157()
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid().ToString()}.xlsx");
|
|
|
|
|
Console.WriteLine("==== SaveAs by strongly type ====");
|
|
|
|
|
var input = JsonConvert.DeserializeObject<IEnumerable<UserAccount>>("[{\"ID\":\"78de23d2-dcb6-bd3d-ec67-c112bbc322a2\",\"Name\":\"Wade\",\"BoD\":\"2020-09-27T00:00:00\",\"Age\":5019,\"VIP\":false,\"Points\":5019.12,\"IgnoredProperty\":null},{\"ID\":\"20d3bfce-27c3-ad3e-4f70-35c81c7e8e45\",\"Name\":\"Felix\",\"BoD\":\"2020-10-25T00:00:00\",\"Age\":7028,\"VIP\":true,\"Points\":7028.46,\"IgnoredProperty\":null},{\"ID\":\"52013bf0-9aeb-48e6-e5f5-e9500afb034f\",\"Name\":\"Phelan\",\"BoD\":\"2021-10-04T00:00:00\",\"Age\":3836,\"VIP\":true,\"Points\":3835.7,\"IgnoredProperty\":null},{\"ID\":\"3b97b87c-7afe-664f-1af5-6914d313ae25\",\"Name\":\"Samuel\",\"BoD\":\"2020-06-21T00:00:00\",\"Age\":9352,\"VIP\":false,\"Points\":9351.71,\"IgnoredProperty\":null},{\"ID\":\"9a989c43-d55f-5306-0d2f-0fbafae135bb\",\"Name\":\"Raymond\",\"BoD\":\"2021-07-12T00:00:00\",\"Age\":8210,\"VIP\":true,\"Points\":8209.76,\"IgnoredProperty\":null}]");
|
|
|
|
|
MiniExcel.SaveAs(path, input);
|
|
|
|
|
|
|
|
|
|
var rows = MiniExcel.Query(path, sheetName: "Sheet1").ToList();
|
|
|
|
|
Assert.Equal(6, rows.Count());
|
|
|
|
|
Assert.Equal("Sheet1", MiniExcel.GetSheetNames(path).First());
|
|
|
|
|
|
|
|
|
|
using (var p = new ExcelPackage(new FileInfo(path)))
|
|
|
|
|
{
|
|
|
|
|
var ws = p.Workbook.Worksheets.First();
|
|
|
|
|
Assert.Equal("Sheet1", ws.Name);
|
|
|
|
|
Assert.Equal("Sheet1", p.Workbook.Worksheets["Sheet1"].Name);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
var path = @"..\..\..\..\..\samples\xlsx\TestIssue157.xlsx";
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
var rows = MiniExcel.Query(path, sheetName: "Sheet1").ToList();
|
|
|
|
|
Assert.Equal(6, rows.Count());
|
|
|
|
|
Assert.Equal("Sheet1", MiniExcel.GetSheetNames(path).First());
|
|
|
|
|
}
|
|
|
|
|
using (var p = new ExcelPackage(new FileInfo(path)))
|
|
|
|
|
{
|
|
|
|
|
var ws = p.Workbook.Worksheets.First();
|
|
|
|
|
Assert.Equal("Sheet1", ws.Name);
|
|
|
|
|
Assert.Equal("Sheet1", p.Workbook.Worksheets["Sheet1"].Name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using (var stream = File.OpenRead(path))
|
|
|
|
|
{
|
|
|
|
|
var rows = MiniExcel.Query<UserAccount>(path, sheetName: "Sheet1").ToList();
|
|
|
|
|
Assert.Equal(5, rows.Count());
|
|
|
|
|
|
|
|
|
|
Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID);
|
|
|
|
|
Assert.Equal("Wade", rows[0].Name);
|
|
|
|
|
Assert.Equal(DateTime.ParseExact("27/09/2020", "dd/MM/yyyy", CultureInfo.InvariantCulture), rows[0].BoD);
|
|
|
|
|
Assert.False(rows[0].VIP);
|
|
|
|
|
Assert.Equal(decimal.Parse("5019.12"), rows[0].Points);
|
|
|
|
|
Assert.Equal(1, rows[0].IgnoredProperty);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-06 17:01:20 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// https://github.com/shps951023/MiniExcel/issues/149
|
|
|
|
|
/// </summary>
|
|
|
|
|
[Fact]
|
|
|
|
|
public void Issue149()
|
|
|
|
|
{
|
|
|
|
|
var chars = new char[] {'\u0000','\u0001','\u0002','\u0003','\u0004','\u0005','\u0006','\u0007','\u0008',
|
|
|
|
|
'\u0009', //<HT>
|
|
|
|
|
'\u000A', //<LF>
|
|
|
|
|
'\u000B','\u000C',
|
|
|
|
|
'\u000D', //<CR>
|
|
|
|
|
'\u000E','\u000F','\u0010','\u0011','\u0012','\u0013','\u0014','\u0015','\u0016',
|
|
|
|
|
'\u0017','\u0018','\u0019','\u001A','\u001B','\u001C','\u001D','\u001E','\u001F','\u007F'
|
|
|
|
|
}.Select(s => s.ToString()).ToArray();
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
var path = @"..\..\..\..\..\samples\xlsx\TestIssue149.xlsx";
|
|
|
|
|
var rows = MiniExcel.Query(path).Select(s => (string)s.A).ToList();
|
|
|
|
|
for (int i = 0; i < chars.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
//output.WriteLine($"{i} , {chars[i]} , {rows[i]}");
|
|
|
|
|
if (i == 13)
|
|
|
|
|
continue;
|
|
|
|
|
Assert.Equal(chars[i], rows[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
string path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xlsx");
|
|
|
|
|
var input = chars.Select(s => new { Test = s.ToString() });
|
|
|
|
|
MiniExcel.SaveAs(path, input);
|
|
|
|
|
|
|
|
|
|
var rows = MiniExcel.Query(path,true).Select(s => (string)s.Test).ToList();
|
|
|
|
|
for (int i = 0; i < chars.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
output.WriteLine($"{i} , {chars[i]} , {rows[i]}");
|
|
|
|
|
if (i == 13 || i == 9 || i == 10)
|
|
|
|
|
continue;
|
|
|
|
|
Assert.Equal(chars[i], rows[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-04-06 17:05:11 +08:00
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
string path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xlsx");
|
|
|
|
|
var input = chars.Select(s => new { Test = s.ToString() });
|
|
|
|
|
MiniExcel.SaveAs(path, input);
|
|
|
|
|
|
|
|
|
|
var rows = MiniExcel.Query<Issue149VO>(path).Select(s => (string)s.Test).ToList();
|
|
|
|
|
for (int i = 0; i < chars.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
output.WriteLine($"{i} , {chars[i]} , {rows[i]}");
|
|
|
|
|
if (i == 13 || i == 9 || i == 10)
|
|
|
|
|
continue;
|
|
|
|
|
Assert.Equal(chars[i], rows[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class Issue149VO
|
|
|
|
|
{
|
|
|
|
|
public string Test { get; set; }
|
2021-04-06 17:01:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-04-06 10:38:08 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// https://github.com/shps951023/MiniExcel/issues/153
|
|
|
|
|
/// </summary>
|
|
|
|
|
[Fact]
|
|
|
|
|
public void Issue153()
|
|
|
|
|
{
|
|
|
|
|
var path = @"..\..\..\..\..\samples\xlsx\TestIssue153.xlsx";
|
|
|
|
|
var rows = MiniExcel.Query(path,true).First() as IDictionary<string,object>;
|
|
|
|
|
Assert.Equal(new[] { "序号", "代号", "新代号", "名称", "XXX" , "部门名称" , "单位" , "ERP工时 (小时)A", "工时(秒) A/3600", "标准人工工时(秒)", "生产标准机器工时(秒)", "财务、标准机器工时(秒)", "更新日期", "产品机种", "备注","最近一次修改前的标准工时(秒)", "最近一次修改前的标准机时(秒)", "备注1" }
|
|
|
|
|
,rows.Keys);
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-01 17:16:05 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// https://github.com/shps951023/MiniExcel/issues/137
|
|
|
|
|
/// </summary>
|
|
|
|
|
[Fact]
|
|
|
|
|
public void Issue137()
|
|
|
|
|
{
|
|
|
|
|
var path = @"..\..\..\..\..\samples\xlsx\TestIssue137.xlsx";
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
var rows = MiniExcel.Query(path).ToList();
|
|
|
|
|
var first = rows[0] as IDictionary<string, object>; //![image](https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png)
|
|
|
|
|
Assert.Equal(new[] { "A", "B", "C", "D", "E", "F", "G", "H" }, first.Keys.ToArray());
|
|
|
|
|
Assert.Equal(11, rows.Count);
|
|
|
|
|
{
|
|
|
|
|
var row = rows[0] as IDictionary<string, object>;
|
|
|
|
|
Assert.Equal("比例", row["A"]);
|
|
|
|
|
Assert.Equal("商品", row["B"]);
|
|
|
|
|
Assert.Equal("滿倉口數", row["C"]);
|
|
|
|
|
Assert.Equal(" ", row["D"]);
|
|
|
|
|
Assert.Equal(" ", row["E"]);
|
|
|
|
|
Assert.Equal(" ", row["F"]);
|
|
|
|
|
Assert.Equal(Double.Parse("0"), row["G"]);
|
|
|
|
|
Assert.Equal("1為港幣 0為台幣", row["H"]);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
var row = rows[1] as IDictionary<string, object>;
|
|
|
|
|
Assert.Equal(double.Parse("1"), row["A"]);
|
|
|
|
|
Assert.Equal("MTX", row["B"]);
|
|
|
|
|
Assert.Equal(double.Parse("10"), row["C"]);
|
|
|
|
|
Assert.Null(row["D"]);
|
|
|
|
|
Assert.Null(row["E"]);
|
|
|
|
|
Assert.Null(row["F"]);
|
|
|
|
|
Assert.Null(row["G"]);
|
|
|
|
|
Assert.Null(row["H"]);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
var row = rows[2] as IDictionary<string, object>;
|
|
|
|
|
Assert.Equal(double.Parse("0.95"), row["A"]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// dynamic query with head
|
|
|
|
|
{
|
|
|
|
|
var rows = MiniExcel.Query(path, true).ToList();
|
|
|
|
|
var first = rows[0] as IDictionary<string, object>; //![image](https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png)
|
|
|
|
|
Assert.Equal(new[] { "比例", "商品", "滿倉口數", "0", "1為港幣 0為台幣" }, first.Keys.ToArray());
|
|
|
|
|
Assert.Equal(10, rows.Count);
|
|
|
|
|
{
|
|
|
|
|
var row = rows[0] as IDictionary<string, object>;
|
|
|
|
|
Assert.Equal(double.Parse("1"), row["比例"]);
|
|
|
|
|
Assert.Equal("MTX", row["商品"]);
|
|
|
|
|
Assert.Equal(double.Parse("10"), row["滿倉口數"]);
|
|
|
|
|
Assert.Null(row["0"]);
|
|
|
|
|
Assert.Null(row["1為港幣 0為台幣"]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
var row = rows[1] as IDictionary<string, object>;
|
|
|
|
|
Assert.Equal(double.Parse("0.95"), row["比例"]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
var rows = MiniExcel.Query<Issue137ExcelRow>(path).ToList();
|
|
|
|
|
Assert.Equal(10, rows.Count);
|
|
|
|
|
{
|
|
|
|
|
var row = rows[0] ;
|
|
|
|
|
Assert.Equal(1, row.比例);
|
|
|
|
|
Assert.Equal("MTX", row.商品);
|
|
|
|
|
Assert.Equal(10, row.滿倉口數);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
var row = rows[1];
|
|
|
|
|
Assert.Equal(0.95, row.比例);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class Issue137ExcelRow
|
|
|
|
|
{
|
|
|
|
|
public double? 比例 { get; set; }
|
|
|
|
|
public string 商品 { get; set; }
|
|
|
|
|
public int? 滿倉口數 { get; set; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// https://github.com/shps951023/MiniExcel/issues/138
|
|
|
|
|
/// </summary>
|
2021-04-01 13:27:39 +08:00
|
|
|
|
[Fact]
|
|
|
|
|
public void Issue138()
|
|
|
|
|
{
|
|
|
|
|
var path = @"..\..\..\..\..\samples\xlsx\TestIssue138.xlsx";
|
|
|
|
|
{
|
|
|
|
|
var rows = MiniExcel.Query(path, true).ToList();
|
|
|
|
|
Assert.Equal(6, rows.Count);
|
2021-04-01 15:16:29 +08:00
|
|
|
|
|
|
|
|
|
foreach (var index in new[] { 0, 2, 5 })
|
|
|
|
|
{
|
|
|
|
|
Assert.Equal(1, rows[index].實單每日損益);
|
|
|
|
|
Assert.Equal(2, rows[index].程式每日損益);
|
|
|
|
|
Assert.Equal("測試商品1", rows[index].商品);
|
|
|
|
|
Assert.Equal(111.11, rows[index].滿倉口數);
|
|
|
|
|
Assert.Equal(111.11, rows[index].波段);
|
|
|
|
|
Assert.Equal(111.11, rows[index].當沖);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (var index in new[] { 1, 3, 4 })
|
|
|
|
|
{
|
|
|
|
|
Assert.Null(rows[index].實單每日損益);
|
|
|
|
|
Assert.Null(rows[index].程式每日損益);
|
|
|
|
|
Assert.Null(rows[index].商品);
|
|
|
|
|
Assert.Null(rows[index].滿倉口數);
|
|
|
|
|
Assert.Null(rows[index].波段);
|
|
|
|
|
Assert.Null(rows[index].當沖);
|
|
|
|
|
}
|
2021-04-01 13:27:39 +08:00
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
var rows = MiniExcel.Query<Issue138ExcelRow>(path).ToList();
|
|
|
|
|
Assert.Equal(6, rows.Count);
|
2021-04-01 14:15:43 +08:00
|
|
|
|
Assert.Equal(new DateTime(2021,3,1), rows[0].date);
|
|
|
|
|
|
|
|
|
|
foreach (var index in new[] { 0,2,5})
|
|
|
|
|
{
|
|
|
|
|
Assert.Equal(1, rows[index].實單每日損益);
|
|
|
|
|
Assert.Equal(2, rows[index].程式每日損益);
|
|
|
|
|
Assert.Equal("測試商品1", rows[index].商品);
|
|
|
|
|
Assert.Equal(111.11, rows[index].滿倉口數);
|
|
|
|
|
Assert.Equal(111.11, rows[index].波段);
|
|
|
|
|
Assert.Equal(111.11, rows[index].當沖);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (var index in new[] { 1, 3, 4 })
|
|
|
|
|
{
|
|
|
|
|
Assert.Null(rows[index].實單每日損益);
|
|
|
|
|
Assert.Null(rows[index].程式每日損益);
|
|
|
|
|
Assert.Null(rows[index].商品);
|
|
|
|
|
Assert.Null(rows[index].滿倉口數);
|
|
|
|
|
Assert.Null(rows[index].波段);
|
|
|
|
|
Assert.Null(rows[index].當沖);
|
|
|
|
|
}
|
2021-04-01 13:27:39 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class Issue138ExcelRow
|
|
|
|
|
{
|
|
|
|
|
public DateTime? date { get; set; }
|
|
|
|
|
public int? 實單每日損益 { get; set; }
|
|
|
|
|
public int? 程式每日損益 { get; set; }
|
|
|
|
|
public string 商品 { get; set; }
|
2021-04-01 14:15:43 +08:00
|
|
|
|
public double? 滿倉口數 { get; set; }
|
2021-04-01 13:27:39 +08:00
|
|
|
|
public double? 波段 { get; set; }
|
|
|
|
|
public double? 當沖 { get; set; }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|