Criar grade com Lista ou DataSet
Bom dia...
Estou precisando criar uma GRADE parecido com nossa grid, só que num arquivo DOC (Word), através dos dados de um DataSet ou List<Classe> (Generic). com isso estará criando um arquivo word com uma grade com estes dados.
Aguardo contato,
Vinicius Climaco.
Vinicius Climaco
Curtidas 0
Respostas
Vinicius Climaco
25/01/2010
Estou querendo usar a classe
Microsoft.Office.Interop.Word
GOSTEI 0
Fabio Mans
25/01/2010
Olá desculpa responder somente hoje, ontem foi feriado em São Paulo.
Você não pode exibir um grid e quando o usuário quiser exportar este grid ele clica em um botão e é gerado um arquivo Word?
Pode ser assim?
Fabio
GOSTEI 0
Vinicius Climaco
25/01/2010
Não, no caso é uma List Generica ou DataSet mesmo... não é um grid.
Inclusive a solução de grid eu vi num artigo acho que do Macoratti, mas não serve, tem que ser DataSet ou List<>.
GOSTEI 0
Fabio Mans
25/01/2010
Vinicios é bem parecido com o exemplo do Grid, abaixo eu mostro um exemplo, a diferença com o Grid é que você pode formatar.
Veja se ajuda.
protected void Button1_Click(object sender, EventArgs e)
{
DataSet ds = new DataSet();
DataTable dt = new DataTable("Table");
dt.Columns.Add("Name", Type.GetType("System.String"));
dt.Columns.Add("Address", Type.GetType("System.String"));
dt.Columns.Add("Phone", Type.GetType("System.String"));
DataRow dr = dt.NewRow();
dr["Name"] = "Sandeep Aparajit";
dr["Address"] = "Redmond USA";
dr["Phone"] = "425-000-0000";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Name"] = "Anthony Gill";
dr["Address"] = "Ohio USA";
dr["Phone"] = "625-000-0000";
dt.Rows.Add(dr);
ds.Tables.Add(dt);
StringBuilder sbContent = new StringBuilder();
for (int i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
{
for (int j = 0; j <= ds.Tables[0].Columns.Count - 1; j++)
{
sbContent.Append(" " + ds.Tables[0].Rows[i][j].ToString() + " ");
}
sbContent.Append("\n");
}
Response.Clear();
Response.AddHeader("content-disposition", "attachment;filename=FileName.doc");
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = "application/msword";
Response.Write(sbContent.ToString());
Response.End();
}
GOSTEI 0
Vinicius Climaco
25/01/2010
Estamos quase lá... rs... mas e quanto ao List<>, terei de gerar em List<> tbm... como ficaria ?
GOSTEI 0
Fabio Mans
25/01/2010
O problema na lista é que eu não tenho a coluna, o que faço converto minha lista para datable e faço igual ao exemplo anterior.
Veja se ajuda.
protected void Button2_Click(object sender, EventArgs e)
{
List<Customer> customers = new List<Customer>
{
new Customer()
{
Id = 123,
GivenName = "Steve",
Surname = "Jobs",
EmailAddress = "steve@apple.com",
NickName = "Steve"
},
new Customer()
{
Id = 789,
GivenName = "Bill",
Surname = "Gates",
EmailAddress = "bgates@microsoft.com",
NickName = "Bill"
}
};
DataTable dataTable = ConverteListParaDataTable(customers);
StringBuilder sbContent = new StringBuilder();
for (int i = 0; i <= dataTable.Rows.Count - 1; i++)
{
for (int j = 0; j <= dataTable.Columns.Count - 1; j++)
{
sbContent.Append(" " + dataTable.Rows[i][j].ToString() + " ");
}
sbContent.Append("\n");
}
Response.Clear();
Response.AddHeader("content-disposition", "attachment;filename=FileName.doc");
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = "application/msword";
Response.Write(sbContent.ToString());
Response.End();
}
public static DataTable ConverteListParaDataTable<T>(List<T> list)
{
DataTable dt = new DataTable();
foreach (PropertyInfo info in typeof(T).GetProperties())
{
dt.Columns.Add(new DataColumn(info.Name, info.PropertyType));
}
foreach (T t in list)
{
DataRow row = dt.NewRow();
foreach (PropertyInfo info in typeof(T).GetProperties())
{
row[info.Name] = info.GetValue(t, null);
}
dt.Rows.Add(row);
}
return dt;
}
GOSTEI 0
Vinicius Climaco
25/01/2010
Assim esta quase certo, mas seguinte... eu preciso usar o Microsoft.Office.Interop.Word para geração do arquivo de Word, no caso não vou ficar fazendo download, minha aplicação é WinForm, mas independente disso quero gerar arquivos em massa, tipo ele vai gerando e salvando o arquivo entende ?
Além disso gostaria de usar template, um arquivo Word já pré formatado e apenas substituir palavras, o problema esta em gerar as grades, pois não queria ficar apenas nas grades verticais (estilo excel), mas também nas horizontais (estilo formulário) repetindo conforme o numero de registros por exemplo, terei uma classe Customer e relacionada a ele tenho um atributo do tipo List<Item> com uma lista de Item´s e eu geraria mais ou menos assim:
Sr. [Fulano],
Comprou em nossa loja o equivalente a [valor_total] e [quantidade] de produtos.
Segue abaixo a lista de produtos:
Item: Bola
Preço: R$ 10,00 Item: Apagador Preço: R$ 5,00 Item: Caneta Preço: R$ 1,00 Att, [Funcionario] Empresa XYZ.COM ------------------ Entendeu como seria ? Não pode ser por download, apenas irá gerar com a classe Microsoft.Office.Interop.Word.
Preço: R$ 10,00 Item: Apagador Preço: R$ 5,00 Item: Caneta Preço: R$ 1,00 Att, [Funcionario] Empresa XYZ.COM ------------------ Entendeu como seria ? Não pode ser por download, apenas irá gerar com a classe Microsoft.Office.Interop.Word.
GOSTEI 0
Fabio Mans
25/01/2010
Vinicius o que você está querendo não está no escopo da consultoria.
Veja o que atendemos
Suporte Técnico .NET - O que está no escopo:
.NET - análise de código fonte: baixa e média complexidade
AJAX (.net)
Análise e projeto de sistemas
Best Practices (camadas, orientação a objetos, etc)
C#
Desenvolvimento WEB - ASP.NET
LINQ
Persistência/ADO.NET
UML
VB.NET
Visual Studio (IDE)
WebServices/XML
Suporte Técnico .NET - O que não está no escopo:
.NET - análise de código-fonte: alta complexidade
Compact Framework
Componentes de terceiros (.net)
Silverlight
Visual Studio Team System
Windows Forms Veja se este artigo te ajuda. http://www.codeproject.com/KB/aspnet/WordTemplate2007.aspx Fabio
.NET - análise de código fonte: baixa e média complexidade
AJAX (.net)
Análise e projeto de sistemas
Best Practices (camadas, orientação a objetos, etc)
C#
Desenvolvimento WEB - ASP.NET
LINQ
Persistência/ADO.NET
UML
VB.NET
Visual Studio (IDE)
WebServices/XML
Suporte Técnico .NET - O que não está no escopo:
.NET - análise de código-fonte: alta complexidade
Compact Framework
Componentes de terceiros (.net)
Silverlight
Visual Studio Team System
Windows Forms Veja se este artigo te ajuda. http://www.codeproject.com/KB/aspnet/WordTemplate2007.aspx Fabio
GOSTEI 0
Vinicius Climaco
25/01/2010
Fabio,
Mas não estou pedindo nada especifico de WinForms, apenas citei que o meu é WinForms, mas a solução que preciso é do Framework, independente de linguagem... apenas não quero fazer o download, quero gerar o arquivo .doc em massa, conforme disse anteriormente inclusive a descrição que preciso segue na msg anterior.
Att,
Vinicius Climaco.
GOSTEI 0
Fabio Mans
25/01/2010
Para salvar em pasta você pode utilizar o método SaveAs.
FileInfo arquivo = new FileInfo("caminho_arquivo/" + FileUpload1.PostedFile.FileName);
if (!arquivo.Exists)
{
arquivo.SaveAs("caminho_arquivo/" + FileUpload1.PostedFile.FileName);
}
GOSTEI 0
Vinicius Climaco
25/01/2010
Certo e usando a classe para alterar e gerar o Word ??
Microsoft.Office.Interop.Word
GOSTEI 0
Fabio Mans
25/01/2010
Utilize a classe deste projeto.
http://www.codeproject.com/KB/aspnet/wordapplication.aspx
Irá facilitar sua vida.
protected void Button2_Click(object sender, EventArgs e)
{
CCWordApp test;
test = new CCWordApp();
test.Open("C:\\Documents and Settings\\f.galante\\Desktop\\TEMP\\test.doc");
test.InsertText("This is the text");
//test.InsertLineBreak;
test.Save();
test.Quit();
}
Baixei o projeto e coloquei os arquivos na bin, meu Office é 2007, escreveu normalmente.
Interop.Microsoft.Office.Core.dll
Interop.Word.dll
Interop.VBIDE.dll
GOSTEI 0
Fabio Mans
25/01/2010
Conseguiu?
GOSTEI 0
Vinicius Climaco
25/01/2010
Consegui um outro artigo que me atende, lhe mando o link amanha.
Pois teria que gerar tudo pela classe que lhe disse... este que vc me enviou não faz isso.
GOSTEI 0