我有asp.net网络应用程序,它发送电子邮件给用户的.xls附件,这个文件有几列显示日期,所以当用户下载这个excel文件在三个系统中,只有用户的系统设置是在dd-mm-yyyy格式的日期是正确显示,对所有其他用户的系统设置不是在dd-mm-yyyy格式它没有正确显示的日期列是不正确的。
如果知道如何解决这个问题,要求是让日期列以dd-mm-yyyy格式显示,而不考虑用户的时间设置
我使用以下几行代码通过电子邮件发送.xls文件
using (StreamReader stRDR = new StreamReader(Server.MapPath("~/2.1.3.2-B-MAILER.html")))
{
sHTMLbody = stRDR.ReadToEnd();
sHTMLbody = sHTMLbody.Replace("{NAME}", sSalesL2name.ToString());
sHTMLbody = sHTMLbody.Replace("{MESSAGEBODY}", sMsgBodyTemplate);
}
var dtServer = DateTime.Now;
string FileName = "SalesL2_" + sSalesL2sapcode + ".xls";
String sPath = Path.GetTempPath() + FileName;
//String sPath = Path.GetTempPath() + sL3sapcode.ToString() + dtServer.ToString("_yyyy-MM-dd__HH-mm-ss") + ".xls";
FileInfo FI = new FileInfo(sPath);
StringWriter stringWriter = new StringWriter();
HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWriter);
// For the below line to work, we need [override void VerifyRenderingInServerForm as part of class]
GridView gvTemp = new GridView();
gvTemp.AllowPaging = false;
gvTemp.DataSource = dtResult;
gvTemp.DataBind();
gvTemp.RenderControl(htmlWrite);
gvTemp = null;
System.IO.StreamWriter vw = new System.IO.StreamWriter(sPath, true);
stringWriter.ToString().Normalize();
vw.Write(stringWriter.ToString());
vw.Flush();
vw.Close();
Attachment attXLS = new Attachment(FI.FullName);
//"application/vnd.ms-excel";
// Send Email
// Create new Mail Object
objMail = new MailMessage(); // Create new Mail Object
objMail.From = new MailAddress("ersdocumenttracking@hcl.com");
**Stored proc**
select distinct t1.[Project code],t1.[Project Description],t1.[Start Date],
t1.[End Date],t1.[Customer],t1.[Customer Name],t1.[Customer Group],
[AM Sales SAPID],[AM Sales Name],[L3 Sales SAPID],[L3 Sales Name],[L2 sales SAPID],[L2 sales Name],
t1.[Proj Category Description],t1.[DU Desc (L4)],t1.[SDU Name (L3)],
t1.[PM Code],t1.[PM Name],t1.[VBDU Desc (L2)],t1.[SPM Code],t1.[SPM Name],t1.[DUH Code],t1.[DUH Name],
t1.[SDUH Code],t1.[SDUH Name],[VBDUH Code],[VBDUH Name],[Geo Reg Name],[Customer SOW],t1.[MSA],
[MSA Start Date],[MSA End Date],[SOW Start Date],[SOW End Date],[Document applicability],
[Avg Rev based on AMJ '18 PP (in $K)] [Avg Rev based on last quarter PP (in $K)],[UAR $K],
[MSA RAG check],[SOW RAG check],
[PONumber],[POValidFrom],[POValidTo],[Balance in $K],
[PO RAG check],[PO Insufficient flag],[MSA Documents remarks], [SOW Documents remarks],
[PO Documents remarks]
from [tbl_MSA_SOW] as t1 left join [tbl_PO] as t2
on t1.[Project code] = t2.[Project Code]
inner join [tbl_Sales_mapping] as t3
on t1.[Project code]=t3.[Project code]
where (t1.[MSA RAG check]=@RagValue or t1.[SOW RAG check]=@RagValue
or t2.[PO RAG check]=@RagValue)
and t3.[L2 sales SAPID]=@sapid and t3.[AM Sales Name] !='-'发布于 2019-05-11 14:32:50
你不应该这么做。如果您发送的是excel工作表,则应向用户显示日期。让excel根据用户的系统设置显示日期。请勿预设格式。如果您这样做了,那么用户将获得字符串形式的日期,并且必须对它们进行转换,以便对数据执行任何有用的操作。另外,有没有什么原因,为什么你发送的是xls而不是xlsx?考虑到这是通过电子邮件进行的,用户将更乐意下载xlsx文件,因为它们被保证不包含宏。Xls被认为是更危险的,许多电子邮件客户端阻止用户打开xls,正是出于这个原因。
编辑
看过你的代码后,我更清楚地理解了这个问题。您生成的并不是真正的Excel电子表格;它只是一个添加了.xls扩展名的文本文件。
要了解其中的区别,请创建一个新的Excel电子表格,输入一些示例数据,然后将其另存为xls (Excel 97格式)。现在在记事本中打开该文件,看看会得到什么。现在打开通过代码生成的文件。
这是怎么回事?Excel足够聪明,能够识别出,尽管您生成的文件具有错误的扩展名(即文件的内容不是xls所需的内容),但它具有可以在电子表格中显示的数据,因此可以方便地加载它。
将扩展名更改为xlsx没有任何帮助。
您有两个选择: 1)诚实并使用适合您生成的文件(*.txt、*.csv等)格式的扩展名;2)您需要将Excel工作簿生成为本地Excel文件。
如果您选择后一种方法,有多种选择: 1)使用c#互操作性库,2)使用第三方Excel库(其中一些是免费的-请使用Google OfficeExcel库)或3)生成您自己的库。我个人不得不选择3)因为1) Office需要安装在web服务器上,2)它要么需要花钱,要么意味着使用自由软件,而我的雇主通常不愿意这样做。
如果你想做,我可以给你一些帮助。我建议的第一步是在Excel中创建一个示例xlsx文件并保存它。然后将资源管理器中的扩展名更改为.zip (是!!)然后提取。然后检查内容。您会发现它很有趣,但这正是您需要创建的。这并不容易,但可以使用.Net中的内置函数来完成。
编辑2)
如果您选择csv路线(我不确定您在这里拥有的是否真的是csv,您需要打开生成的文件以确保),那么它目前只能在dd-mm-yyyy日期格式的系统上正常工作。要使其适用于任何区域设置,您需要日期格式为ISO 8601 (即yyyy-mm-dd)。要做到这一点,您有两个选择。首先,在生成数据时更改存储过程以格式化日期,如下所示:
SELECT CONVERT(varchar(10), your_date, 126) AS your_date FROM your_table;(请注意,您应该为输出列提供别名,否则将得到Expr1等)。其次,您可以在检索数据后向DataTable中添加一个DataColumn,遍历DataTable的各行,并为新列分配已有日期列的ISO8601格式版本,然后删除已有日期列。在生成文本输出之前完成所有这些操作。
https://stackoverflow.com/questions/56087777
复制相似问题