顯示具有 C# 標籤的文章。 顯示所有文章
顯示具有 C# 標籤的文章。 顯示所有文章

2019年1月16日

EPPlus讀取 xlsx,以 ExcelRange取值疑雲

客戶反應我們提供的報表表格有錯
最後追蹤到了是以 EPPlus讀取來源檔案 xlsx時,取 head row的範圍有錯

先看看兩個檔案的內容
測試用:


客戶用:



經由這段程式碼取 header row的內容:
// sheet.Cells[1,1,1,5]
foreach (var cell in sheet.Cells[sheet.Dimension.Start.Row, sheet.Dimension.Start.Column, sheet.Dimension.End.Row, sheet.Dimension.Start.Column])
{
    result.Add(GetAttributeModel(cell));
}

但是測試用檔案在 foreach執行取得的第一個 cell總是 "B1",客戶用檔案的 cell卻是 "A1"
到底是 EPPlus有問題還是檔案有問題 ...

因為追蹤原始碼工程浩大,決定先從檔案著手,解壓縮來比對看看
馬上抓到疑點!!

檔案位置:\{檔名}\xl\worksheets\sheet1.xml

很明顯在第 18行有鬼,左側是測試用檔案,因為沒有框線,在 xml內乾脆直接不存在了

好樣的 ...
因為我們自己測試用檔案都是 key完值就拿去上傳了,框線什麼的才沒空加呢,以至於之前完全沒碰到此種情境,也不知道程式其實是有 bug的,只是運氣不好才沒碰到

2018年3月22日

C# lock (typeof (Object)) CA2002

在 IBatisNet內看到這樣的用法:
lock (typeof (SqlMapper))
{
  ...
}

程式碼分析給出了 CA2002
不知道為什麼會寫出 lock typeof object的東西,這樣真的能鎖住東西?

C# 巢狀 Using 的程式碼分析警告 CA2202

使用 Visual Studio的程式碼分析(Code Analysis)功能,如果程式碼中有使用巢狀 using時:
using (StreamReader sr = new StreamReader(inputStream))
{
  using (CsvReader csvReader = new CsvReader(sr))
  {
    ..
  }
}
就會出現警告 CA2202:不要多次處置物件的 Dispose方法

但是在 MSDN的這篇 IDisposable.Dispose Method ()說明中寫道:如果一個物件被多次呼叫 Dispose方法,第一次之後的呼叫都會被忽略

 If an object's Dispose method is called more than once, the object must ignore all calls after the first one. The object must not throw an exception if its Dispose method is called multiple times. Instance methods other than Dispose can throw an ObjectDisposedException when resources are already disposed.

所以實際使用上是沒問題的
但是這樣在 Code Analysis就會卡著一個甚至多個警告訊息,看了很礙眼
那就在 function上加一個 SuppressMessage,讓這個警告不會再出現
[SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")]
public byte[] FunctionName(...) {

好啦這是在 StackOverflow上挖出來的解法
但是討論串內要直接用 SuppressMessage,還是用醜一點的寫法解掉這個訊息,還是有很多爭論

2015年3月20日

Java的 milliseconds 轉成 c#的 DateTime

long javaMilliSec = 1386862447000;

new DateTime(1970,1,1,0,0,0,DateTimeKind.Utc).Add(new TimeSpan(javaMilliSec *TimeSpan.TicksPerMillisecond)).ToString("yyyy/MM/dd HH:mm:ss")

ref: Get c# DateTime from Java System.currentTimeMillis

2014年10月2日

json轉 GUID字串檢核格式不嚴謹

foreach (object obj in args)
{
    if (obj == null)//需過濾參數=null
    {
        continue;
    }
    else if (obj.ToString().Length == 38 && obj.ToString().IndexOf("-", 0, 10) == 9)
    {
        activityId = JsonConvert.DeserializeObject<guid>(obj.ToString());
        break;
    }
    else if (obj.ToString().Length == 36 && obj.ToString().IndexOf("-", 0, 10) == 8)
    {
        activityId = Guid.Parse(obj.ToString());
        break;
    }
}

然後人家輸入一個剛好長度 38的字串,第一個 - 又剛好在第十個字元 就死了


原本我是想到用 regular expression做檢核
想了一串的 regex
Regex regGuid = new Regex("[{(]?[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[]{12}[})]?");

後來看到別人提供的做法
foreach (object obj in args)
{
    if (obj == null)
    {
        continue;
    }
    else if (Guid.TryParse(obj.ToString(), out activityId))
    {
        break;
    }
}

只是要注意 tryparse失敗的話 guid會被填成 Guid.Empty

2013年1月31日

2012年8月23日

C# 讀取檔案

System.IO.StreamReader file = new System.IO.StreamReader(filePath);

string articleString = file.ReadToEnd();

中文亂碼
StreamReader預設是用 UTF-8做讀取 所以要再設定解碼方式
new System.IO.StreamReader(filePath, Encoding.Default);
default預設用 ANSI解碼

C# 讀取含中文的檔案