excel货币数据根据区域设置而变化

时间:2016-05-26 11:01:32

标签: c# mysql excel

面对一个问题,我在MySQL表中有两列。一个是货币英语格式(1.0000)和德语(1,0000),但是当我将数据从导出导出到excel(自定义)时,我的货币列数据不会像数据库中那样出现。

示例 - 如果区域设置是英语(美国) - >货币(英文格式) - 1.0000(正确) - >货币(德语格式) - 10,000(错误)

如果区域设置是德语(德国) - >货币(英文格式) - 10.000(错误) - >货币(德语格式) - 1,0000(正确)

我想要我的数据,因为它存在于我的表格中。

是否可以从excel方面做任何事情或在C#方面做任何建议?

我用过

  

cultureInfo.Invarientculture

但没有结果。

这是用于创建Excel文件的代码:

私有字符串ExportToExcelFile(DataTable dtTable)     {

    string tab = "";
    StringBuilder sbldr = new StringBuilder();
    if (dtTable.Columns.Count != 0)
    {
        foreach (DataColumn col in dtTable.Columns)
        {
            sbldr.Append(tab + col.ColumnName);
            tab = "\t";
        }
        sbldr.Append("\n");
        foreach (DataRow row in dtTable.Rows)
        {
            tab = "";
            foreach (DataColumn column in dtTable.Columns)
            {
                string temp = row[column].ToString();
                string txt = temp.ToString(CultureInfo.InvariantCulture);

                if (column.ToString() == "Currency Rate(English)")
                {
                    NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat;

                    // Displays a value with the default separator (".").
                    // Displays the same value with a blank as the separator.
                    nfi.NumberDecimalSeparator = ".";
                    //var priceAsDecimal = Decimal.Parse(temp, NumberStyles.Currency);
                    //string priceAsDecimal1=priceAsDecimal.ToString("C");
                   // double number = Convert.ToDouble(temp);
                   // string a=number.ToString("G", CultureInfo.InvariantCulture);
                    //sbldr.Append(tab + a);
                    sbldr.Append(tab + txt.ToString(nfi).Replace("\n", " ").Replace("\n\r", ";").Replace("\r", " ").Replace("0", "0"));
                    //sbldr.Append(tab + a.Replace("\n", " ").Replace("\n\r", ";").Replace("\r", " ").Replace("0", "0"));
                }
                //else if (column.ToString() == "Currency Rate(German)")
                //{
                //    string txt = temp.ToString(cultureDe);
                //    sbldr.Append(tab + txt.ToString().Replace("\n", " ").Replace("\n\r", ";").Replace("\r", " ").Replace("0", "0"));
                //}
                else
                {
                    sbldr.Append(tab + row[column].ToString().Replace("\n", " ").Replace("\n\r", ";").Replace("\r", " ").Replace("0", "0"));
                }
                tab = "\t";
            }
            sbldr.Append("\n");
        }
    }
    return sbldr.ToString();
}

1 个答案:

答案 0 :(得分:0)

您的代码根本没有创建Excel文件。它正在创建制表符分隔的字符串,您使用错误的内容类型和文件扩展名将其发送到客户端。

Excel可以很好地读取分隔文件,但不能猜测使用哪个分隔符或代码页来创建它。当您从“数据”选项卡打开文本文件时,Excel允许您指定分隔符,代码页等。当您双击该文件,或尝试直接从浏览器打开它(实际上是相同的),它可以不显示对话框并使用最终用户的区域设置和ANSI代码页。

使用像EPPlus这样的库,创建一个真正的Excel文件更容易实现批次。你得到一个真正的Excel文件,它也允许你应用格式,添加图表等。结果也是 lot ,因为xlsx是压缩的xml。

图书馆的网站已直接从服务器中包含an example that returns a spreadsheet。删除自定义格式,就像:

一样简单
    private void DumpExcel(DataTable tbl)
    {
        using (ExcelPackage pck = new ExcelPackage())
        {
            //Create the worksheet
            ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Demo");

            //Load the datatable into the sheet, starting from cell A1. Print the column names on row 1
            ws.Cells["A1"].LoadFromDataTable(tbl, true);

            //Omitted formatting code 

            //Write it back to the client
            Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            Response.AddHeader("content-disposition", "attachment;  filename=ExcelDemo.xlsx");
            Response.BinaryWrite(pck.GetAsByteArray());
        }
    }

格式化一系列单元格或整列也很容易

//Example how to Format Column 1 as numeric 
using (ExcelRange col = ws.Cells[2, 1, 2 + tbl.Rows.Count, 1])
{
    col.Style.Numberformat.Format = "#,##0.00";
    col.Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;
}

该示例包含更改字体和颜色的类似代码