Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以编程方式将文本文件转换为具有良好表格格式的自定义特定excel格式_C#_Excel_Visual Studio 2010_Visual Studio_Grouping - Fatal编程技术网

C# 如何以编程方式将文本文件转换为具有良好表格格式的自定义特定excel格式

C# 如何以编程方式将文本文件转换为具有良好表格格式的自定义特定excel格式,c#,excel,visual-studio-2010,visual-studio,grouping,C#,Excel,Visual Studio 2010,Visual Studio,Grouping,我想将我的文本文件转换为特定的excel格式,如下所示。我怎样才能做到这一点 在文本文件中,有许多组件具有相同的位置名称。因此,基本上我想将具有相同位置名称的所有组件聚集到一行,组件总数在第二列中,以此类推。请指导我如何才能做到这一点 代码段: string[] lines = File.ReadAllLines(@"c:\bleh\testdata.txt"); List<Item> allItems = new List<Item>(lines.Length);

我想将我的文本文件转换为特定的excel格式,如下所示。我怎样才能做到这一点

在文本文件中,有许多组件具有相同的位置名称。因此,基本上我想将具有相同位置名称的所有组件聚集到一行,组件总数在第二列中,以此类推。请指导我如何才能做到这一点

代码段:

 string[] lines = File.ReadAllLines(@"c:\bleh\testdata.txt");
 List<Item> allItems = new List<Item>(lines.Length);
 Dictionary<string, List<Item>> itemsByLocation = new Dictionary<string, List<Item>>   (StringComparer.OrdinalIgnoreCase);
// loop the file, start at 1 assuming headings first row
for (int i = 1; i < lines.Length; i++)
{
// nothing interesting here, just parsing the file
string[] columns = lines[i].Split(new char[] { ';', ',' });                
Item item = new Item() { 
    Designator = columns[ORDINAL_DESIGNATOR], 
    MaxPn = columns[ORDINAL_MAXPN], 
    Footprint = columns[ORDINAL_FOOTPRINT], 
    Location = columns[ORDINAL_LOCATION] };

allItems.Add(item);
List<Item> itemsForThisKey = null;
if (itemsByLocation.TryGetValue(item.Location, out itemsForThisKey) == false)
{
    // we don't already have this location in the dictionary, add it
    itemsForThisKey = new List<Item>();
    itemsByLocation.Add(item.Location, itemsForThisKey);
}
itemsForThisKey.Add(item); // add this item to the relevant grouping
string[]lines=File.ReadAllLines(@“c:\bleh\testdata.txt”);
List allItems=新列表(行.长度);
Dictionary itemsByLocation=新字典(StringComparer.OrdinalingOreCase);
//循环文件,从第一行的1开始
对于(int i=1;i
}

项目中出现错误
错误1找不到类型或命名空间名称“Item”(是否缺少using指令或程序集引用?
此外,
错误7的错误当前上下文中不存在名称“序号指示器”
请提供任何帮助!!!
非常感谢。

我想你的问题实际上是关于如何进行分组,而不是关于如何读取文件并输出到Excel。我猜分组选择的数据结构应该是一个字典,所以在本例中,您的键应该是“Location”,您将所有匹配项放在该键上以创建分组

或者,您也可以使用linq-DOWN,它有两种方式

string[] lines = File.ReadAllLines(@"c:\bleh\testdata.txt");
List<Item> allItems = new List<Item>(lines.Length);
Dictionary<string, List<Item>> itemsByLocation = new Dictionary<string, List<Item>>(StringComparer.OrdinalIgnoreCase);
// loop the file, start at 1 assuming headings first row
for (int i = 1; i < lines.Length; i++)
{
    // nothing interesting here, just parsing the file
    string[] columns = lines[i].Split(new char[] { '\t' });                
    Item item = new Item() { 
        Designator = columns[ORDINAL_DESIGNATOR], 
        MaxPn = columns[ORDINAL_MAXPN], 
        Footprint = columns[ORDINAL_FOOTPRINT], 
        Location = columns[ORDINAL_LOCATION] };

    allItems.Add(item);
    List<Item> itemsForThisKey = null;
    if (itemsByLocation.TryGetValue(item.Location, out itemsForThisKey) == false)
    {
        // we don't already have this location in the dictionary, add it
        itemsForThisKey = new List<Item>();
        itemsByLocation.Add(item.Location, itemsForThisKey);
    }
    itemsForThisKey.Add(item); // add this item to the relevant grouping
}

// obligatory answer in linq
var itemsByLocationWithLinq = from singleItem in allItems
                    group singleItem by singleItem.Location into groupedItems
                    select new { Location = groupedItems.Key, Items = groupedItems.ToList() };

// now you have your groups so you can do with them as you will
foreach (var itemLocation in itemsByLocationWithLinq)            
    Console.WriteLine("Linq: {0} has {1:#,0} items", itemLocation.Location, itemLocation.Items.Count);

foreach (var itemLocation in itemsByLocation.Keys)
    Console.WriteLine("Dictionary: {0} has {1:#,0} items", itemLocation, itemsByLocation[itemLocation].Count);            

我不清楚你到底在问什么。如果要创建Excel文件,我建议使用以下选项之一:

1) 使用第三方组件编写Excel文件。我用过一种细胞,看到了吗

2) 使用C自动化Microsoft的Excel,请参见

3) 使用ADO和Jet
请参见

这是完整代码的最后一部分

创建一个类来存储excel工作表的特定行。然后在循环中分配数据

public class ExcelData
{
    public int SrNo { get; set; }
    public int Total { get; set; }
    public List<string> Designator { get; set; }
    public string Comment  { get; set; }
    public string Footprint  { get; set; }
    public string Location  { get; set; }

    public ExcelData()
    {
        Designator = new List<string>();
    }
}

你已经试过做什么了?你应该向我们展示你为解决这个问题所付出的努力。@furkle我只需要一个从哪里开始的建议。。谢谢人们还在自动化Excel吗?我以为这些天每个人都在使用OpenOfficeXMLSDK:哦,我承认我已经很久没有这么做了!总是有一些新的处理方法:)
Error 1找不到类型或命名空间名称“Item”(是否缺少using指令或程序集引用?)
错误7当前上下文中不存在名称“ORDINAL_DESIGNATOR”
它只是一个片段而不是整个程序:)ORDINAL_DESIGNATOR只是常量,您可以定义它们(文本文件中的列号,因此ORDINAL_DESIGNATOR为零,ORDINAL_MAXPN为1等)。Item是一个保存数据的简单类,只需使用这些属性定义一个类即可。为了完整起见,我将把它添加到示例中。非常感谢。。但是shell的输出excel正在生成excel工作表。但是该文件只有标题列名。。里面没有数据..是的,我试过。。因为它显示'fline.Comment=cells[1]的实例null错误`对现在它完美了。。但校准是不正确的
public class ExcelData
{
    public int SrNo { get; set; }
    public int Total { get; set; }
    public List<string> Designator { get; set; }
    public string Comment  { get; set; }
    public string Footprint  { get; set; }
    public string Location  { get; set; }

    public ExcelData()
    {
        Designator = new List<string>();
    }
}
List<ExcelData> lstExcel = new List<ExcelData>();
ExcelData fline = null;
for (int i = 0; i < strLines.Length; i++)
{
    line = RemoveWhiteSpace(strLines[i]).Trim();
    if (line.Length == 0)
        continue;
    string[] cells = line.Replace("\"", "").Split('\t');

    if (i > 0)
    {
        if (cells[1] != LastComment)
        {
            if (fline != null)
                lstExcel.Add(fline);
            fline = new ExcelData();
            fline.SrNo++;
            fline.Footprint = cells[2].Replace(" ", "_");
            fline.Comment = cells[1].Replace(" ", "_");


            iCarousel++;
            if (iCarousel > 45)
                iCarousel = 1;
            LastComment = cells[1];
            fline.Location = String.Format("{0}:{1}", CarouselName, iCarousel);
        }

        fline.Designator.Add(cells[0].Replace(" ", "_"));                        
        fline.Total++;
    }
}
ExportInExcel(lstExcel, @"D:\myExcel.xls");
private void ExportInExcel(List<ExcelData> lstData, string excelPath)
{
    Microsoft.Office.Interop.Excel.Application xlApp;
    Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
    Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;
    object misValue = System.Reflection.Missing.Value;

    xlApp = new Microsoft.Office.Interop.Excel.Application();
    xlWorkBook = xlApp.Workbooks.Add(misValue);
    xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);


    xlWorkSheet.Cells[1, 1] = "Sr No.";
    xlWorkSheet.Cells[1, 2] = "Total";
    xlWorkSheet.Cells[1, 3] = "Designator";
    xlWorkSheet.Cells[1, 4] = "Comment";
    xlWorkSheet.Cells[1, 5] = "Footprint";
    xlWorkSheet.Cells[1, 6] = "Location";

    for (int i = 0; i < lstData.Count; i++)
    {
        //i+2 : in Excel file row index is starting from 1. It's not a 0 index based collection
        xlWorkSheet.Cells[i + 2, 1] = (i + 1).ToString();
        xlWorkSheet.Cells[i + 2, 2] = lstData[i].Total.ToString();
        xlWorkSheet.Cells[i + 2, 3] = String.Join(",",lstData[i].Designator.ToArray());
        xlWorkSheet.Cells[i + 2, 4] = lstData[i].Comment;
        xlWorkSheet.Cells[i + 2, 5] = lstData[i].Footprint;
        xlWorkSheet.Cells[i + 2, 6] = lstData[i].Location;

    }

    xlWorkBook.SaveAs(excelPath, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
    xlWorkBook.Close(true, misValue, misValue);
    xlApp.Quit();

    releaseObject(xlWorkSheet);
    releaseObject(xlWorkBook);
    releaseObject(xlApp);
}

//This function is created to release the excel class object.
private void releaseObject(object obj)
{
    try
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
        obj = null;
    }
    catch (Exception ex)
    {
        obj = null;
        MessageBox.Show("Exception Occured while releasing object " + ex.ToString());
    }
    finally
    {
        GC.Collect();
    }
}