首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用C#将Excel单元格值从数字转换为文本

使用C#将Excel单元格值从数字转换为文本
EN

Stack Overflow用户
提问于 2015-03-17 07:19:09
回答 1查看 4.4K关注 0票数 0

我正在使用下面的过程打开我的excel:

代码语言:javascript
复制
if (dt != null) 
{
    foreach(DataColumn dc in dt.Columns) 
    {
        Response.Write(dc.ColumnName + "\t");
        //sep = ";";
    }
    Response.Write(System.Environment.NewLine);
    foreach(DataRow dr in dt.Rows) 
    {
        for (int i = 0; i < dt.Columns.Count; i++) 
        {
            Response.Write(dr[i].ToString() + "\t");
        }
        Response.Write("\n");
    }

    Response.Flush();
    Response.SuppressContent = true;
    HttpContext.Current.ApplicationInstance.CompleteRequest();
}

在我的数据表中,我有一个数字值,它在excel呈现时对右对齐,因为这是excel的默认属性,可以正确地对齐数值。但根据我的要求,我必须在excel中将该数值与左侧对齐。为此,我尝试从后端添加空间,但excel在呈现时忽略空间。我尝试在列值之前添加',但是当excel呈现列值时,显示的是'2015'2016

任何人都可以帮我解决这个问题。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-17 07:52:11

您将导出为CSV文件。如果您使用OpenXML,您将能够指定列DataTypes (格式),还可以将左对齐应用于数字(例如:

代码语言:javascript
复制
using OfficeOpenXml;
using OfficeOpenXml.Style;

public static bool IsNumeric(this DataColumn col) {
    if (col == null)
        return false;

    //This should be moved to const in order to improve performance
    var numericTypes = new [] { typeof(Byte), typeof(Decimal), typeof(Double), typeof(Int16), typeof(Int32), typeof(Int64), typeof(SByte), typeof(Single), typeof(UInt16), typeof(UInt32), typeof(UInt64)};
    return numericTypes.Contains(col.DataType);
}

public static void ExportToExcelOpen(DataSet ds, string filename)
{
    // Create a spreadsheet document by supplying the filename
    // By default, AutoSave = true, Editable = true, and Type = xlsx

    HttpContext.Current.Response.ClearHeaders();
    HttpContext.Current.Response.ClearContent();
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.Buffer = true;
    HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + filename);
    HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    HttpContext.Current.Response.Charset = "";

    MemoryStream ms = new MemoryStream();

    using (var objSpreadsheet = SpreadsheetDocument.Create(ms, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook))
    {
        var workbookPart = objSpreadsheet.AddWorkbookPart();
        objSpreadsheet.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook();
        objSpreadsheet.WorkbookPart.Workbook.Sheets = new DocumentFormat.OpenXml.Spreadsheet.Sheets();

        uint sheetId = 1;

        foreach (DataTable table in ds.Tables)
        {
            var sheetPart = objSpreadsheet.WorkbookPart.AddNewPart<WorksheetPart>();
            var sheetData = new DocumentFormat.OpenXml.Spreadsheet.SheetData();
            sheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet(sheetData);

            DocumentFormat.OpenXml.Spreadsheet.Sheets sheets = objSpreadsheet.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>();
            string relationshipId = objSpreadsheet.WorkbookPart.GetIdOfPart(sheetPart);

            sheetId += 1;

            DocumentFormat.OpenXml.Spreadsheet.Sheet sheet = new DocumentFormat.OpenXml.Spreadsheet.Sheet() { Id = relationshipId, SheetId = sheetId, Name = table.TableName };
            sheets.Append(sheet);

            DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row();

            Dictionary<string, bool> columns = new Dictionary<string, bool>(); 
            foreach (DataColumn column in table.Columns) 
            { 
                //Check for numeric column HERE!!
                columns.Add(column.ColumnName, column.IsNumeric());   

                DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell(); 
                cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String; 
                cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(column.ColumnName); 
                headerRow.AppendChild(cell); 
            }

            sheetData.AppendChild(headerRow);

            NumberFormatInfo valueNumberFormatInfo = new NumberFormatInfo() { NumberDecimalSeparator = ".", NumberGroupSeparator = String.Empty };
            foreach (DataRow dsrow in table.Rows) 
            { 
                DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row(); 
                foreach (KeyValuePair<string, bool> col in columns) 
                { 
                    DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
                    if (col.Value)
                    {
                        cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.Number; 
                        cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(String.Format(valueNumberFormatInfo, "0.####################", dsrow[col.Key]));
                         //Left Alignment HERE
                         cell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Left;
                    }
                    else
                    {
                        cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String; 
                        cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(dsrow[col.Key].ToString());
                    } 
                    newRow.AppendChild(cell); 
                } 

                sheetData.AppendChild(newRow); 
            }
        }

        objSpreadsheet.Close();
        ms.WriteTo(HttpContext.Current.Response.OutputStream);
        ms.Close();

        HttpContext.Current.Response.Flush();
        HttpContext.Current.Response.End();
    }
}

参考文献:http://forums.asp.net/t/1860267.aspx?How+to+retain+data+types+when+exporting+to+Excel+using+Open+XML

参考文献:Set text align to center in an Excel document using OpenXML with C#

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29093346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档