Posts
25/01/2010
Vinicius Climaco
Estou querendo usar a classe
Microsoft.Office.Interop.Word
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
26/01/2010
Vinicius Climaco
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<>.
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();
}
26/01/2010
Vinicius Climaco
Estamos quase lá... rs... mas e quanto ao List<>, terei de gerar em List<> tbm... como ficaria ?
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;
}
26/01/2010
Vinicius Climaco
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.
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
26/01/2010
Vinicius Climaco
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.
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);
}
26/01/2010
Vinicius Climaco
Certo e usando a classe para alterar e gerar o Word ??
Microsoft.Office.Interop.Word
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
27/01/2010
Vinicius Climaco
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.